Asp.net MVC ModelState.Clear


116

क्या कोई मुझे Asp.net MVC (या किसी एक के लिए एक लिंक) में ModelState की भूमिका की एक संक्षिप्त परिभाषा दे सकता है। विशेष रूप से मुझे यह जानना होगा कि किन स्थितियों में कॉल करना आवश्यक या वांछनीय है ModelState.Clear()

थोड़ा खुला हुह समाप्त हो गया ... क्षमा करें, मुझे लगता है कि यह मदद कर सकता है अगर आप बताएं कि मैं क्या कर रहा हूं:

मेरे पास "पृष्ठ" नामक एक नियंत्रक पर संपादन की कार्रवाई है। जब मैं पहली बार पृष्ठ का विवरण बदलने के लिए फ़ॉर्म देखता हूं तो सब कुछ ठीक हो जाता है ("MyCmsPage" ऑब्जेक्ट पर बाइंडिंग)। फिर मैं एक बटन क्लिक करता हूं जो MyCmsPage ऑब्जेक्ट के फ़ील्ड्स ( MyCmsPage.SeoTitle) में से एक के लिए एक मूल्य उत्पन्न करता है । यह ठीक जनरेट करता है और ऑब्जेक्ट को अपडेट करता है और मैं फिर नए संशोधित पेज ऑब्जेक्ट के साथ एक्शन रिजल्ट लौटाता हूं और उम्मीद करता हूं कि संबंधित टेक्स्टबॉक्स ( <%= Html.TextBox("seoTitle", page.SeoTitle)%>अपडेट का उपयोग करके ) अपडेट किया जाए ... लेकिन अफसोस कि यह पुराने मॉडल से मूल्य प्रदर्शित करता है जो लोड किया गया था।

मैंने इसका उपयोग करके चारों ओर काम किया है, ModelState.Clear()लेकिन मुझे यह जानने की आवश्यकता है कि इसने क्यों / कैसे काम किया है इसलिए मैं इसे आँख बंद करके नहीं कर रहा हूं।

PageController:

[AcceptVerbs("POST")]
public ActionResult Edit(MyCmsPage page, string submitButton)
{
    // add the seoTitle to the current page object
    page.GenerateSeoTitle();

    // why must I do this?
    ModelState.Clear();

    // return the modified page object
     return View(page);
 }

aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyCmsPage>" %>
....
        <div class="c">
            <label for="seoTitle">
                Seo Title</label>
            <%= Html.TextBox("seoTitle", page.SeoTitle)%>
            <input type="submit" value="Generate Seo Title" name="submitButton" />
        </div>

Noob AspMVC, यदि यह पुराने डेटा को कैश करना चाहता है, तो उपयोगकर्ता को फिर से मॉडल देने में क्या बात है: @ मेरे पास एक ही मुद्दा था, बहुत बहुत धन्यवाद
deadManN

जवाबों:


135

मुझे लगता है कि MVC में एक बग है। मैं आज इस मुद्दे से घंटों जूझता रहा।

अगर यह दिया रहे:

public ViewResult SomeAction(SomeModel model) 
{
    model.SomeString = "some value";
    return View(model); 
}

परिवर्तनों को अनदेखा करते हुए, मूल मॉडल के साथ दृश्य प्रस्तुत करता है। तो मैंने सोचा, शायद यह मुझे उसी मॉडल का उपयोग करना पसंद नहीं है, इसलिए मैंने इस तरह की कोशिश की:

public ViewResult SomeAction(SomeModel model) 
{
    var newModel = new SomeModel { SomeString = "some value" };
    return View(newModel); 
}

और फिर भी दृश्य मूल मॉडल के साथ प्रदान करता है। क्या अजीब है, जब मैं दृश्य में एक विराम बिंदु डालता हूं और मॉडल की जांच करता हूं, तो इसका बदला हुआ मूल्य है। लेकिन प्रतिक्रिया धारा के पुराने मूल्य हैं।

आखिरकार मैंने वही काम खोज लिया जो आपने किया था:

public ViewResult SomeAction(SomeModel model) 
{
    var newModel = new SomeModel { SomeString = "some value" };
    ModelState.Clear();
    return View(newModel); 
}

उम्मीद के मुताबिक काम करता है।

मुझे नहीं लगता कि यह एक "विशेषता" है, क्या यह है?


33
बस आप के रूप में लगभग एक ही बात की थी। पता चला कि यह एक बग नहीं है, हालांकि। यह डिजाइन द्वारा है: एक बग? EditorFor और DisplayFor एक ही मूल्य प्रदर्शित नहीं करते हैं और ASP.NET MVC के Html हेल्पर्स गलत मान प्रस्तुत करते हैं
Metro Smurf

8
यार, मैंने पहले ही इसके साथ लड़ते हुए 2 घंटे बिताए हैं। इस उत्तर को पोस्ट करने के लिए धन्यवाद!
एंड्री एजिबालोव

37
यह अभी भी सच है और मेरे सहित बहुत से लोग, इस वजह से बहुत समय खो रहे हैं। बग या डिजाइन, मुझे परवाह नहीं है, यह "अप्रत्याशित" है।
प्रांतीय

7
मैं @Proviste से सहमत हूं, मुझे उम्मीद है कि यह "सुविधा" भविष्य में हटा दी जाएगी
बेन

8
मैंने इस पर सिर्फ चार घंटे बिताए। बदसूरत।
ब्रायन मैकके

46

अपडेट करें:

  • यह एक बग नहीं है।
  • कृपया View()POST कार्रवाई से वापस आना बंद करें । इसके बजाय PRG का उपयोग करें और यदि कार्रवाई सफल हो तो GET पर पुनर्निर्देशित करें।
  • यदि आप एक POST कार्रवाई से लौट रहे हैंView() , तो इसे फॉर्म सत्यापन के लिए करें, और इसे उसी तरह से करें जैसे MVC को सहायकों में बनाया गया है। यदि आप इसे इस तरह करते हैं तो आपको उपयोग करने की आवश्यकता नहीं है.Clear()
  • यदि आप स्पा के लिए अजाक्स वापस करने के लिए इस क्रिया का उपयोग कर रहे हैं , तो वेब एपीआई नियंत्रक का उपयोग करें और भूल जाइए ModelStateक्योंकि आप इसे वैसे भी उपयोग नहीं कर रहे हैं।

पुराना उत्तर:

MVC में ModelState का उपयोग मुख्य रूप से उस वस्तु के संबंध में किसी मॉडल वस्तु की स्थिति का वर्णन करने के लिए किया जाता है, चाहे वह वस्तु वैध हो या नहीं। इस ट्यूटोरियल को बहुत कुछ समझाना चाहिए।

आमतौर पर आपको ModelState को खाली करने की आवश्यकता नहीं है क्योंकि यह आपके लिए MVC इंजन द्वारा बनाए रखा जाता है। MVC सत्यापन सर्वोत्तम प्रथाओं का पालन करने का प्रयास करते समय इसे मैन्युअल रूप से साफ़ करने से अवांछित परिणाम हो सकते हैं।

ऐसा लगता है कि आप शीर्षक के लिए एक डिफ़ॉल्ट मान सेट करने का प्रयास कर रहे हैं। यह तब किया जाना चाहिए जब मॉडल ऑब्जेक्ट को तत्काल किया जाता है (डोमेन परत कहीं या ऑब्जेक्ट में ही - पैरामीटर रहित ctor), इस तरह की कार्रवाई पर कि यह पृष्ठ पर पहली बार नीचे जाता है या पूरी तरह से क्लाइंट पर (अजाक्स या कुछ के माध्यम से) ताकि यह ऐसा प्रतीत हो जैसे कि उपयोगकर्ता ने इसे दर्ज किया है और यह पोस्ट किए गए फ़ॉर्म संग्रह के साथ वापस आता है। प्रपत्र संग्रह (POST क्रिया // संपादन) में प्राप्त होने पर इस मूल्य को जोड़ने का आपका तरीका कुछ इस तरह के विचित्र व्यवहार का कारण बन रहा है, जिसके परिणामस्वरूप आपको काम करने की .Clear() इच्छा हो सकती है । मेरा विश्वास करो - आप स्पष्ट का उपयोग नहीं करना चाहते हैं। अन्य विचारों में से एक का प्रयास करें।


1
मेरी सेवाओं की परत को थोड़ा सा मोड़ने में मेरी मदद करता है (कराहना लेकिन thx) लेकिन नेट पर बहुत सारे सामान के साथ यह सत्यापन के लिए मॉडलस्टैट का उपयोग करने के दृष्टिकोण की ओर बहुत अधिक निर्भर करता है।
मिस्टर ग्रोक

इस प्रश्न के बारे में अधिक जानकारी के लिए कि मैं विशेष रूप से ModelState.Clear () और मेरी क्वेरी का कारण क्यों बताता हूं
Mr Grok

5
मैं वास्तव में एक [HttpPost] फ़ंक्शन से व्यू (...) को रोकने के लिए इस तर्क को नहीं खरीदता । यदि आप अजाक्स के माध्यम से सामग्री पोस्ट कर रहे हैं और फिर परिणामी आंशिक दृश्य के साथ दस्तावेज़ को अपडेट कर रहे हैं, तो एमवीसी मॉडलस्टेट को गलत दिखाया गया है। एकमात्र वर्कअराउंड मैंने पाया है कि इसे कंट्रोलर मेथड में क्लियर करना है।
हारून हडॉन

@AaronHudon PRG बहुत अच्छी तरह से स्थापित है।
मैट कोकाज

अगर मैं एक AJAX कॉल के साथ POST कर सकता हूं तो क्या मैं GET कार्रवाई के लिए पुनर्निर्देशित कर सकता हूं और एक मॉडल भरा दृश्य वापस कर सकता हूं जैसे ओपी चाहता है, सभी अतुल्यकालिक रूप से?
MyEEye

17

यदि आप किसी व्यक्तिगत क्षेत्र के लिए कोई मान साफ़ करना चाहते हैं तो मुझे निम्न तकनीक उपयोगी लगी।

ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));

नोट: "कुंजी" को उस फ़ील्ड के नाम में बदलें जिसे आप रीसेट करना चाहते हैं।


मुझे नहीं पता कि इसने मेरे लिए अलग तरीके से काम क्यों किया (MVC4 शायद)? लेकिन मुझे भी मॉडलिंग करनी थी। केई = "" बाद में। दोनों लाइनों की आवश्यकता है।
टीटीटी

मैं आपकी टिप्पणी @PeterGluck को हटाने के लिए आपको बधाई देना चाहता हूं। यह पूरा मॉडलस्टेट साफ़ करने से बेहतर है (क्योंकि मुझे कुछ क्षेत्रों में त्रुटियां मिली हैं जिन्हें मैं रखना चाहूंगा)।
ताज़

6

खैर ModelState मूल रूप से सत्यापन के मामले में मॉडल की वर्तमान स्थिति रखती है, यह रखती है

ModelErrorCollection: मॉडल को मानों को बाँधने का प्रयास करते समय त्रुटियों का प्रतिनिधित्व करता है। पूर्व।

TryUpdateModel();
UpdateModel();

या ActionResult में एक पैरामीटर की तरह

public ActionResult Create(Person person)

ValueProviderResult : मॉडल के लिए प्रयास किए गए बाइंड के बारे में विवरण रखें। पूर्व। प्रयास, संस्कृति, RawValue

स्पष्ट () पद्धति का उपयोग सावधानी के साथ किया जाना चाहिए क्योंकि यह अनिर्दिष्ट परिणामों को जन्म दे सकता है। और आप मॉडलस्टेट के कुछ अच्छे गुणों को खो देंगे जैसे कि अटेम्पटेडवैल्यू, इसका उपयोग MVC द्वारा पृष्ठभूमि में त्रुटि के मामले में फॉर्म वैल्यू को फिर से दिखाने के लिए किया जाता है।

ModelState["a"].Value.AttemptedValue

1
हम्म् ... यह वह जगह हो सकती है जहां मैं इसे देख रहा हूं। मैंने Model.SeoTitle प्रॉपर्टी के मूल्य का निरीक्षण किया है और यह बदल गया है लेकिन प्रयास मूल्य नहीं हुआ है। लगता है जैसे यह मान चिपका रहा है जैसे कि पृष्ठ पर कोई त्रुटि है भले ही एक नहीं है (मॉडलस्टैट शब्दकोश की जांच की है और कोई त्रुटि नहीं है)।
श्री ग्रोक नोव 22'09

6

मेरे पास एक उदाहरण था जहां मैं एक संक्षिप्त रूप के मॉडल को अपडेट करना चाहता था, और प्रदर्शन के कारण 'पुनर्निर्देशित कार्रवाई' नहीं करना चाहता था। छिपे हुए फ़ील्ड के पिछले मानों को मेरे अपडेट किए गए मॉडल पर बनाए रखा जा रहा था - जिससे मुद्दों की allsorts!

कोड की कुछ पंक्तियों ने जल्द ही ModelState के भीतर उन तत्वों की पहचान कर ली जिन्हें मैं (सत्यापन के बाद) हटाना चाहता था, इसलिए नए मानों का उपयोग फ़ॉर्म में किया गया था: -

while (ModelState.FirstOrDefault(ms => ms.Key.ToString().StartsWith("SearchResult")).Value != null)
{
    ModelState.Remove(ModelState.FirstOrDefault(ms => ms.Key.ToString().StartsWith("SearchResult")));
}

5

हम में से बहुत से लोगों को यह लगता है कि यह काट दिया गया है, और यद्यपि यह होने का कारण यह समझ में आता है कि मुझे यह सुनिश्चित करने के लिए एक तरीका चाहिए था कि मेरे मॉडल पर मूल्य दिखाया गया था, न कि मॉडलस्टेट।

कुछ ने सुझाव दिया है ModelState.Remove(string key), लेकिन यह स्पष्ट नहीं है कि क्या keyहोना चाहिए, खासकर नेस्टेड मॉडल के लिए। यहाँ कुछ तरीके दिए गए हैं जिनकी सहायता से मैं आया हूँ।

RemoveStateForविधि एक ले जाएगा ModelStateDictionaryएक मॉडल है, और वांछित संपत्ति के लिए एक अभिव्यक्ति है, और उसे निकाल दें। HiddenForModelमॉडल से केवल मान का उपयोग करके एक छिपी हुई इनपुट फ़ील्ड बनाने के लिए अपने दृश्य में उपयोग किया जा सकता है, पहले इसकी ModelState प्रविष्टि को हटाकर। (यह अन्य सहायक एक्सटेंशन विधियों के लिए आसानी से विस्तारित किया जा सकता है)।

/// <summary>
/// Returns a hidden input field for the specified property. The corresponding value will first be removed from
/// the ModelState to ensure that the current Model value is shown.
/// </summary>
public static MvcHtmlString HiddenForModel<TModel, TProperty>(this HtmlHelper<TModel> helper,
    Expression<Func<TModel, TProperty>> expression)
{
    RemoveStateFor(helper.ViewData.ModelState, helper.ViewData.Model, expression);
    return helper.HiddenFor(expression);
}

/// <summary>
/// Removes the ModelState entry corresponding to the specified property on the model. Call this when changing
/// Model values on the server after a postback, to prevent ModelState entries from taking precedence.
/// </summary>
public static void RemoveStateFor<TModel, TProperty>(this ModelStateDictionary modelState, TModel model,
    Expression<Func<TModel, TProperty>> expression)
{
    var key = ExpressionHelper.GetExpressionText(expression);

    modelState.Remove(key);
}

इस तरह एक नियंत्रक से कॉल करें:

ModelState.RemoveStateFor(model, m => m.MySubProperty.MySubValue);

या इस तरह से एक दृश्य से:

@Html.HiddenForModel(m => m.MySubProperty.MySubValue)

यह System.Web.Mvc.ExpressionHelperModelState प्रॉपर्टी का नाम पाने के लिए उपयोग करता है।


1
बहुत अच्छा! एक्सप्रेशनहेलर कार्यक्षमता के लिए इस पर एक टैब रखते हुए।
जेरार्ड ओनेइल

4

यदि यह काफी मान्य नहीं था, तो मैं इस मूल्य को अद्यतन या रीसेट करना चाहता था, और इस समस्या में भाग गया।

आसान जवाब, ModelState.Remove, है .. समस्याग्रस्त .. क्योंकि यदि आप सहायकों का उपयोग कर रहे हैं तो आप वास्तव में नाम नहीं जानते हैं (जब तक कि आप नामकरण सम्मेलन द्वारा छड़ी नहीं करते)। जब तक कि शायद आप एक ऐसा फंक्शन न बना लें जो आपका कस्टम हेल्पर और आपका कंट्रोलर दोनों एक नाम लेने के लिए इस्तेमाल कर सकते हैं।

यह सुविधा सहायक पर एक विकल्प के रूप में लागू की जानी चाहिए थी, जहां डिफ़ॉल्ट रूप से ऐसा नहीं होता है , लेकिन यदि आप अस्वीकार्य इनपुट को फिर से परिभाषित करना चाहते हैं तो आप बस इतना ही कह सकते हैं।

लेकिन कम से कम मैं अब इस मुद्दे को समझता हूं;)।


मुझे वास्तव में ऐसा करने की आवश्यकता थी; अपने तरीके देखें जिन्हें मैंने नीचे पोस्ट किया था जिससे मुझे Remove()सही कुंजी मिली ।
टोबियास जे

0

अंत में मिल गया। मेरा कस्टम मॉडलबिंडर जो पंजीकृत नहीं किया जा रहा था और यह करता है:

var mymsPage = new MyCmsPage();

NameValueCollection frm = controllerContext.HttpContext.Request.Form;

myCmsPage.SeoTitle = (!String.IsNullOrEmpty(frm["seoTitle"])) ? frm["seoTitle"] : null;

ऐसा कुछ है जो डिफ़ॉल्ट मॉडल बाइंडिंग कर रहा था समस्या पैदा कर रहा है। निश्चित नहीं है कि क्या है, लेकिन मेरी समस्या कम से कम अब तय हो गई है कि मेरा कस्टम मॉडल बाइंडर पंजीकृत किया जा रहा है।


वैसे मुझे कस्टम ModelBinder के साथ कोई अनुभव नहीं है, डिफ़ॉल्ट एक मेरी जरूरतों को अभी तक फिट बैठता है =)।
JOBG

0

आम तौर पर, जब आप अपने आप को एक मानक मानक प्रथाओं के खिलाफ लड़ते हुए पाते हैं, तो यह आपके दृष्टिकोण पर पुनर्विचार करने का समय है। इस मामले में, ModelState का व्यवहार। उदाहरण के लिए, जब आप POST के बाद मॉडल स्थिति नहीं चाहते हैं, तो प्राप्त करने के लिए एक पुनर्निर्देशन पर विचार करें।

[HttpPost]
public ActionResult Edit(MyCmsPage page, string submitButton)
{
    if (ModelState.IsValid) {
        SomeRepository.SaveChanges(page);
        return RedirectToAction("GenerateSeoTitle",new { page.Id });
    }
    return View(page);
}

public ActionResult GenerateSeoTitle(int id) {
     var page = SomeRepository.Find(id);
     page.GenerateSeoTitle();
     return View("Edit",page);
}

संस्कृति टिप्पणी का जवाब देने के लिए:

यहाँ मैं एक बहु-सांस्कृतिक एमवीसी एप्लिकेशन को संभालने के लिए उपयोग करता हूं। पहला मार्ग हैंडलर उपवर्ग:

public class SingleCultureMvcRouteHandler : MvcRouteHandler {
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var culture = requestContext.RouteData.Values["culture"].ToString();
        if (string.IsNullOrWhiteSpace(culture))
        {
            culture = "en";
        }
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    }
}

public class MultiCultureMvcRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var culture = requestContext.RouteData.Values["culture"].ToString();
        if (string.IsNullOrWhiteSpace(culture))
        {
            culture = "en";
        }
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    }
}

public class CultureConstraint : IRouteConstraint
{
    private string[] _values;
    public CultureConstraint(params string[] values)
    {
        this._values = values;
    }

    public bool Match(HttpContextBase httpContext,Route route,string parameterName,
                        RouteValueDictionary values, RouteDirection routeDirection)
    {

        // Get the value called "parameterName" from the 
        // RouteValueDictionary called "value"
        string value = values[parameterName].ToString();
        // Return true is the list of allowed values contains 
        // this value.
        return _values.Contains(value);

    }

}

public enum Culture
{
    es = 2,
    en = 1
}

और यहाँ है कि कैसे मैं मार्गों को तार। मार्गों को बनाने के बाद, मैं अपना सबगेंट (उदाहरण.com/subagent1, example.com/subagent2, आदि) तब संस्कृति कोड प्रस्तुत करता हूं। यदि आप सभी की जरूरत संस्कृति है, बस मार्ग संचालकों और मार्गों से सबगेंट हटा दें।

    public static void RegisterRoutes(RouteCollection routes)
    {

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("Content/{*pathInfo}");
        routes.IgnoreRoute("Cache/{*pathInfo}");
        routes.IgnoreRoute("Scripts/{pathInfo}.js");
        routes.IgnoreRoute("favicon.ico");
        routes.IgnoreRoute("apple-touch-icon.png");
        routes.IgnoreRoute("apple-touch-icon-precomposed.png");

        /* Dynamically generated robots.txt */
        routes.MapRoute(
            "Robots.txt", "robots.txt",
            new { controller = "Robots", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
             "Sitemap", // Route name
             "{subagent}/sitemap.xml", // URL with parameters
             new { subagent = "aq", controller = "Default", action = "Sitemap"},  new[] { "aq3.Controllers" } // Parameter defaults
        );

        routes.MapRoute(
             "Rss Feed", // Route name
             "{subagent}/rss", // URL with parameters
             new { subagent = "aq", controller = "Default", action = "RSS"},  new[] { "aq3.Controllers" } // Parameter defaults
        );

        /* remap wordpress tags to mvc blog posts */
        routes.MapRoute(
            "Tag", "tag/{title}",
            new { subagent = "aq", controller = "Default", action = "ThreeOhOne", id = UrlParameter.Optional},  new[] { "aq3.Controllers" }
        ).RouteHandler = new MultiCultureMvcRouteHandler(); ;

        routes.MapRoute(
            "Custom Errors", "Error/{*errorType}",
            new { controller = "Error", action = "Index", id = UrlParameter.Optional},  new[] { "aq3.Controllers" }
        );

        /* dynamic images not loaded from content folder */
        routes.MapRoute(
            "Stock Images",
            "{subagent}/Images/{*filename}",
            new { subagent = "aq", controller = "Image", action = "Show", id = UrlParameter.Optional, culture = "en"},  new[] { "aq3.Controllers" }
        );

        /* localized routes follow */
        routes.MapRoute(
            "Localized Images",
            "Images/{*filename}",
            new { subagent = "aq", controller = "Image", action = "Show", id = UrlParameter.Optional},  new[] { "aq3.Controllers" }
        ).RouteHandler = new MultiCultureMvcRouteHandler();

        routes.MapRoute(
            "Blog Posts",
            "Blog/{*postname}",
            new { subagent = "aq", controller = "Blog", action = "Index", id = UrlParameter.Optional},  new[] { "aq3.Controllers" }
        ).RouteHandler = new MultiCultureMvcRouteHandler();

        routes.MapRoute(
            "Office Posts",
            "Office/{*address}",
            new { subagent = "aq", controller = "Offices", action = "Address", id = UrlParameter.Optional }, new[] { "aq3.Controllers" }
        ).RouteHandler = new MultiCultureMvcRouteHandler();

        routes.MapRoute(
             "Default", // Route name
             "{controller}/{action}/{id}", // URL with parameters
             new { subagent = "aq", controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "aq3.Controllers" } // Parameter defaults
        ).RouteHandler = new MultiCultureMvcRouteHandler();

        foreach (System.Web.Routing.Route r in routes)
        {
            if (r.RouteHandler is MultiCultureMvcRouteHandler)
            {
                r.Url = "{subagent}/{culture}/" + r.Url;
                //Adding default culture 
                if (r.Defaults == null)
                {
                    r.Defaults = new RouteValueDictionary();
                }
                r.Defaults.Add("culture", Culture.en.ToString());

                //Adding constraint for culture param
                if (r.Constraints == null)
                {
                    r.Constraints = new RouteValueDictionary();
                }
                r.Constraints.Add("culture", new CultureConstraint(Culture.en.ToString(), Culture.es.ToString()));
            }
        }

    }

आप POST REDIRECT अभ्यास का सुझाव दे रहे हैं, वास्तव में मैं लगभग हर पोस्ट कार्रवाई के लिए ऐसा करता हूं। हालाँकि मुझे इसकी बहुत विशेष आवश्यकता थी: मेरे पास पृष्ठ के शीर्ष पर एक फ़िल्टर फॉर्म है, शुरू में इसे प्राप्त करें। लेकिन मैं एक तारीख क्षेत्र के साथ बाध्य नहीं होने की समस्या में भाग गया और तब पता चला कि GET अनुरोध आसपास की संस्कृति को आगे नहीं बढ़ाता (मैं अपने ऐप के लिए फ्रेंच का उपयोग करता हूं), इसलिए मुझे अपनी तिथि को सफलतापूर्वक बांधने के लिए POST के अनुरोध को स्विच करना पड़ा। फिर यह समस्या आई, मैंने उसे थोड़ा
रोका

@SouhaiebBesbes मेरे अपडेट देखें कि मैं संस्कृति को कैसे संभालता हूं।
B2K

@SouhaiebBesbes शायद थोड़ा सा सरल होगा जो TempData में आपकी संस्कृति को संग्रहीत करेगा। देखें stackoverflow.com/questions/12422930/...
B2K

0

ठीक है, यह मेरे रेजर पेज पर काम करता था और कभी भी .cs फ़ाइल के लिए एक गोल यात्रा भी नहीं करता था। यह पुराना html तरीका है। यह उपयोगी हो सकता है।

<input type="reset" value="Reset">
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.