HTTPPOST, অভিধান বা ফর্মের মানগুলি কীভাবে পুনরুদ্ধার করবেন?


112

আমার একটি এমভিসি নিয়ন্ত্রক রয়েছে যার এই ক্রিয়া পদ্ধতিটি রয়েছে:

[HttpPost]
public ActionResult SubmitAction()
{
     // Get Post Params Here
 ... return something ...
}

ফর্মটি একটি সাধারণ পাঠ্যবাক্স সহ একটি তুচ্ছ ফর্ম।

প্রশ্ন

আমি কীভাবে প্যারামিটারের মানগুলিতে অ্যাক্সেস করব?

আমি কোনও ভিউ থেকে পোস্ট করছি না, পোস্টটি বাহ্যিকভাবে আসছে। আমি ধরে নিচ্ছি যে আমার কাছে কী / মান জোড়ার অ্যাক্সেস রয়েছে তার সংগ্রহ রয়েছে।

আমি চেষ্টা করেছিলাম Request.Params.Get("simpleTextBox");তবে এটি ত্রুটি ফেরায় "দুঃখিত, আপনার অনুরোধটি প্রক্রিয়া করার সময় একটি ত্রুটি ঘটেছে"।

উত্তর:


155

আপনি নিজের কন্ট্রোলার পদক্ষেপ নিতে পারেন এমন কোনও জিনিস যা ফর্ম ইনপুট নামগুলি প্রতিফলিত করবে এবং ডিফল্ট মডেল বাইন্ডার স্বয়ংক্রিয়ভাবে আপনার জন্য এই বস্তুটি তৈরি করবে:

[HttpPost]
public ActionResult SubmitAction(SomeModel model)
{
    var value1 = model.SimpleProp1;
    var value2 = model.SimpleProp2;
    var value3 = model.ComplexProp1.SimpleProp1;
    ...

    ... return something ...
}

আর একটি (স্পষ্টতই কুরুচিপূর্ণ) উপায়:

[HttpPost]
public ActionResult SubmitAction()
{
    var value1 = Request["SimpleProp1"];
    var value2 = Request["SimpleProp2"];
    var value3 = Request["ComplexProp1.SimpleProp1"];
    ...

    ... return something ...
}

5
আমি কেবল এটিই উল্লেখ করতে চাই যে আপনি বিকল্প 2 তে সংকলকটির ব্যাকআপ হারিয়ে ফেলেছেন the মডেলটি পরিবর্তিত হলে, সংকলক সম্পর্কিত নিয়ন্ত্রণকারীগুলির পরিবর্তনটি ধরবে না। বিকল্প 2 এর জন্য ভাল কেস রয়েছে তবে আমি প্রশস্ত ব্যবহারকে উত্সাহিত করব না।
সেরগেই ফেদোরভ

1
কখনও কখনও আপনার কুরুচিপূর্ণ জিনিসগুলির প্রয়োজন হয়, যখন আপনি ইতিমধ্যে সেরা অনুশীলনগুলি কী তা ইতিমধ্যে জেনে
অস্কার অর্টিজ

যেহেতু কেউ এখনও ডট নেট শিখছে, দ্বিতীয় উপায়টি কেন খারাপ?
গোস

3
@ গুজ, কারণ এটি যাদু স্ট্রিং। আপনি কোনও সংকলনের সময় সুরক্ষা পাবেন না। আপনার কোডটি রান টাইমে ব্যর্থ হবে যদি আপনি ভেরিয়েবলের নামে টাইপ করেন তবে আপনি যদি শক্ত টাইপিং ব্যবহার করছেন তবে সংকলকটি আপনার বন্ধু হবে।
দারিন দিমিত্রভ

পছন্দ করুন আমি যে পৃথিবী থেকে এসেছি তার চেয়ে আলাদা। খুব সুন্দর বৈশিষ্ট্য।
গোস

104

সহজভাবে, আপনি FormCollectionযেমন ব্যবহার করতে পারেন :

[HttpPost] 
public ActionResult SubmitAction(FormCollection collection)
{
     // Get Post Params Here
 string var1 = collection["var1"];
}

আপনি এমন একটি শ্রেণিও ব্যবহার করতে পারেন যা ফর্মের মানগুলির সাথে ম্যাপ করা থাকে এবং এসপ নেটওয়্যার এমভিসি ইঞ্জিন স্বয়ংক্রিয়ভাবে এটি পূরণ করে:

//Defined in another file
class MyForm
{
  public string var1 { get; set; }
}

[HttpPost]
public ActionResult SubmitAction(MyForm form)
{      
  string var1 = form1.Var1;
}

আমি ক্লাস সমাধানটি এর সহজ এবং সহজ পছন্দ করেছিলাম
বাশির আল-মোমানি

36

উত্তরগুলি খুব ভাল তবে এমভিসি এবং .NET এর সর্বশেষ প্রকাশের আর একটি উপায় আছে যা আমি "পুরাতন স্কুল" ফর্ম সংগ্রহ এবং অনুরোধ কীগুলির পরিবর্তে সত্যই ব্যবহার করতে চাই।


ফর্ম ট্যাগের মধ্যে থাকা এইচটিএমএল স্নিপেটটি বিবেচনা করুন যা হয় কোনও এজাক্স বা ফর্ম পোস্ট করে।

<input type="hidden"   name="TrackingID" 
<input type="text"     name="FirstName"  id="firstnametext" />
<input type="checkbox" name="IsLegal"  value="Do you accept terms and conditions?" />

আপনার নিয়ামক প্রকৃতপক্ষে ফর্ম ডেটা বিশ্লেষণ করবে এবং সংজ্ঞায়িত ধরণের পরামিতি হিসাবে এটি আপনার কাছে পৌঁছে দেওয়ার চেষ্টা করবে। আমি চেকবক্সটি অন্তর্ভুক্ত করেছি কারণ এটি একটি কৃপণ। এটি যদি চেক করা থাকে তবে "চালু" পাঠ্যটি পরীক্ষিত করে এবং যদি চেক না করা হয় তবে শূন্য হয়। যদিও প্রয়োজনটি হ'ল এই সংজ্ঞায়িত ভেরিয়েবলগুলি অবশ্যই বিদ্যমান (যদি না ক্ষয়যোগ্য (তবে এটি ক্ষুদ্র তবে মনে রাখবেন না string)) নাহলে এজেএক্স বা পোষ্ট ব্যর্থ হবে।

[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
    MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}

আপনি কোনও রেজার সাহায্যকারী ব্যবহার না করে কোনও মডেল ফিরে পোস্ট করতে পারেন। আমি এসেছি যে এটি কিছু সময় প্রয়োজন।

public Class HomeModel
{
  public int HouseNumber { get; set; }
  public string StreetAddress { get; set; }
}

এইচটিএমএল চিহ্নিতকরণটি কেবল ...

<input type="text" name="variableName.HouseNumber" id="whateverid" >

এবং আপনার নিয়ামক (রেজার ইঞ্জিন) ফর্ম ভেরিয়েবল "ভেরিয়েবলনেম" (নামটি আপনার পছন্দ মতো তবে এটি ধারাবাহিকভাবে বজায় রাখবেন) বাধা দেবে এবং এটিকে তৈরি করার চেষ্টা করবে এবং এটি মাইমোডেলে কাস্ট করবে।

[HttpPost]
public ActionResult PostBack(HomeModel variableName){
    postBack.HouseNumber; //The value user entered
    postBack.StreetAddress; //the default value of NULL.
}

যখন কোনও নিয়ামক কোনও মডেলের প্রত্যাশা করে (এই ক্ষেত্রে হোমমোডেল) আপনার সমস্ত ক্ষেত্র সংজ্ঞায়িত করতে হবে না কারণ পার্সার কেবল সেগুলি ডিফল্টরূপে ছেড়ে যায়, সাধারণত ন্যূনাল। সুন্দর জিনিস হ'ল আপনি মার্ক-আপে বিভিন্ন মডেলকে মিশ্রিত করতে এবং মেলাতে পারেন এবং পোস্ট ব্যাক পার্স যতটা সম্ভব পপুলেশন করবে। আপনাকে পৃষ্ঠায় কোনও মডেল নির্ধারণ করতে বা কোনও সহায়ক ব্যবহার করার দরকার নেই।

টিআইপি: কন্ট্রোলারে থাকা প্যারামিটারের নামটি এইচটিএমএল মার্ক-আপে "নাম =" সংজ্ঞায়িত নামটি মডেলের নাম নয় তবে প্রত্যাশিত ভেরিয়েবলের নাম!


List<>এর মার্ক আপে ব্যবহার করা কিছুটা জটিল।

<input type="text" name="variableNameHere[0].HouseNumber" id="id"           value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber"                   value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">

তালিকায় সূচক <> আবশ্যক সর্বদা শূন্য ভিত্তিক এবং ক্রমযুক্ত। 0,1,2,3।

[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
     int counter = MyHomes.Count()
     foreach(var home in MyHomes)
     { ... }
}

ব্যবহার IEnumerable<>অ শূন্য জন্য ভিত্তি করে এবং অ অনুক্রমিক সূচকের ফিরে পোস্ট করুন। বাইন্ডারটিকে সাহায্য করতে আমাদের একটি অতিরিক্ত লুকানো ইনপুট যুক্ত করতে হবে।

<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id"      value="3">

<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3"   value="4">

<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23"    value="5">

এবং কোডটির কেবলমাত্র আইনিউমারেবল এবং কল ব্যবহার করা দরকার ToList()

[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
     int counter = variableNameHere.ToList().Count()
     foreach(var home in variableNameHere)
     { ... }
}

প্রতি পৃষ্ঠায় একটি জটিল 'ভিউ' মডেল তৈরি করার জন্য একটি একক মডেল বা একটি ভিউমোডেল (অন্যান্য মডেলকে প্রত্যাখ্যানকারী মডেল) ব্যবহার করার পরামর্শ দেওয়া হয়। প্রস্তাবিত হিসাবে মেশানো এবং মেলানো খারাপ অনুশীলন হিসাবে বিবেচনা করা যেতে পারে, তবে যতক্ষণ না এটি কাজ করে এবং পঠনযোগ্য এটি বিএডি নয়। এটি অবশ্য রেজার ইঞ্জিনের শক্তি এবং নমনীয়তা প্রদর্শন করে।

সুতরাং যদি আপনাকে নির্বিচারে কিছু বাদ দিতে হয় বা রেজার সাহায্যকারী থেকে অন্য কোনও মূল্যকে ওভাররাইড করা প্রয়োজন হয় বা কেবলমাত্র নিজের সাহায্যকারী তৈরির মতো মনে হয় না, এমন একক ফর্মের জন্য যা কিছু অসাধারণ ডেটার সংমিশ্রণ ব্যবহার করে, আপনি দ্রুত অতিরিক্ত গ্রহণ করার জন্য এই পদ্ধতিগুলি ব্যবহার করতে পারেন ডেটা।


সূচক বিকল্পটি ব্যবহার করা অস্পষ্ট। Greenশ্বরের সবুজ পৃথিবীতে কে ব্যবহার করতে জানত বা এটি বিদ্যমান ছিল ?! তবে, আমি এই পোস্টটি পেয়েছি বলে আমি আনন্দিত। এটি নেটওয়ার্ক ট্র্যাফিকের একটি বিরাট পরিমাণে সঞ্চয় করতে চলেছে।
মাইকেল সিলভার

1
এটি আমার পক্ষে কাজ করেছে তবে কেবলমাত্র আমি <ইনপুট টাইপ = "লুকানো" আইডি = "মাইআইডি"> পরিবর্তন করে @ এইচটিএমএল.হিডেন ("মাইআইডি")
রডকান

@ পাইওটার - দয়া করে মাইমোডেল এবং মাইহোমসের সাথে আপনার রেফারেন্সের অসঙ্গতিগুলি ঠিক করুন। এটি বর্তমানে এটি কীভাবে বিভ্রান্তির কারণ হয়ে দাঁড়ায়।
স্পেনসার সুলিভান

15

আপনি যদি কোনও মডেলের বাইন্ডিং ছাড়াই এইচটিটিপি অনুরোধ থেকে সরাসরি ফর্ম ডেটা পেতে চান বা FormCollectionআপনি এটি ব্যবহার করতে পারেন:

[HttpPost] 
public ActionResult SubmitAction() {

    // This will return an string array of all keys in the form.
    // NOTE: you specify the keys in form by the name attributes e.g:
    // <input name="this is the key" value="some value" type="test" />
    var keys = Request.Form.AllKeys;

    // This will return the value for the keys.
    var value1 = Request.Form.Get(keys[0]);
    var value2 = Request.Form.Get(keys[1]);
}

2
সতর্কতা যে এটি খারাপ ফর্ম হতে পারে (কোনও পাং উদ্দেশ্যে নয়) তবে কখনও কখনও আপনি কেবল ফর্মের মান চান এবং আপনি পরিষ্কারভাবে ফাংশনের স্বাক্ষর পরিবর্তন করতে পারবেন না। এটিই এখানে একমাত্র সমাধান যা আমার বিশেষ পরিস্থিতির জন্য উপযুক্ত।
রায়ান

এই স্ট্যাটিক রেফারেন্স সহ এই পদ্ধতিটি কীভাবে পরীক্ষা করবেন? টেস্টিংয়ের ক্ষেত্রে ফর্ম ক্লেকশনটি আরও আকাঙ্ক্ষিত হবে।
কিস ডি উইট

@ কেসেডওইট আপনি আগের মন্তব্যটি পড়লে এটি সর্বোত্তম উপায় নয়, তবে কখনও কখনও কর্মশালা হিসাবে ব্যবহার করুন। ইউনিট পরীক্ষায়, সম্ভবত আপনি উপহাস করতে পারেন Requestএবং এটি পদ্ধতিতে ইনজেক্ট করতে পারেন।
এ-শারাবিয়ানী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.