Asp.net MVC ModelState.C Clear


116

যে কেউ আমাকে Asp.net এমভিসিতে মডেলস্টেটের ভূমিকার একটি সংক্ষিপ্ত সংজ্ঞা দিতে পারে (বা তার একটি লিঙ্ক)। বিশেষত আমাকে কোন পরিস্থিতিতে কল করা বা আকাঙ্ক্ষিত তা জানতে হবে ModelState.Clear()

বিট ওপেন এন্ড হুহ ... দুঃখিত, আমি মনে করি আমি কী করণীয় করছি তা যদি জানায় তবে এটি সাহায্য করতে পারে:

আমার একটি নিয়ামকের উপর "পৃষ্ঠা" নামক সম্পাদনার একটি ক্রিয়া রয়েছে। আমি যখন পৃষ্ঠার বিবরণ পরিবর্তন করতে ফর্মটি প্রথম দেখি তখন সমস্ত কিছু জরিমানা হয়ে যায় ("" মাইকিএমএসপেজ "অবজেক্টে আবদ্ধ)। তারপরে আমি একটি বোতামটি ক্লিক করি যা মাইসিএমএসপেজ অবজেক্টের ক্ষেত্রগুলির ( 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>

নূব এএসপিএমভিসি, যদি এটি পুরানো ডেটা ক্যাশে করতে চায়, তবে আবার ব্যবহারকারীর কাছে মডেল দেওয়ার কী লাভ আছে: @ আমার একই সমস্যা ছিল, অনেক
ভাইকে

উত্তর:


135

আমি মনে করি এমভিসিতে একটি বাগ। আমি আজ কয়েক ঘন্টা এই সমস্যা নিয়ে সংগ্রাম করেছি।

প্রদত্ত এই:

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
আপনার মতো ঠিক প্রায় একই জিনিসটি করেছেন। যদিও এটি একটি বাগ নয়, খুঁজে পাওয়া গেছে। এটি ডিজাইনের দ্বারা: একটি বাগ? এডিটরফোর্ড এবং ডিসপ্লেফোর্ডের জন্য একই মান এবং এএসপি.নেট এমভিসির এইচটিএমএল সাহায্যকারীরা সঠিক মূল্য রেন্ডার করে না
মেট্রো স্মুরফ

8
মানুষ, আমি এর সাথে 2 ঘন্টা যুদ্ধ করে ইতিমধ্যে কাটিয়েছি। এই উত্তর পোস্ট করার জন্য ধন্যবাদ!
আন্দ্রে আগিবালোভ

37
এটি এখনও সত্য এবং এর ফলে আমাকে সহ প্রচুর লোকেরা প্রচুর সময় হারাচ্ছেন। বাগ বা ডিজাইনের দ্বারা, আমি পাত্তা দিই না, এটি "অপ্রত্যাশিত"।
Proviste

7
আমি @ প্রভিস্টের সাথে একমত, আমি আশা করি ভবিষ্যতে এই "বৈশিষ্ট্য" সরানো হয়েছে
বেন

8
আমি এই মাত্র চার ঘন্টা ব্যয়। কুশ্রী।
ব্রায়ান ম্যাকেকে

46

হালনাগাদ:

  • এটি একটি বাগ না।
  • দয়া করে View()কোনও পোস্ট পদক্ষেপ থেকে ফিরে আসা বন্ধ করুন । ব্যবহারের PRG পরিবর্তে এবং একটি পেতে পুনর্নির্দেশ যদি ক্রিয়াটির একটি সাফল্য।
  • আপনি যদি হয় একটি ফিরতি View()একটি পোষ্ট কর্ম থেকে, ফর্ম যাচাইকরণ জন্য এটা করতে, এবং এটি উপায় না MVC ডিজাইন করা হয়েছে সাহায্যকারী সালে নির্মিত ব্যবহার করে। আপনি যদি এইভাবে এটি করেন তবে আপনার ব্যবহারের দরকার নেই.Clear()
  • আপনি যদি কোনও এসপিএর জন্য অজ্যাক্স ফিরিয়ে দেওয়ার জন্য এই ক্রিয়াটি ব্যবহার করছেন তবে একটি ওয়েব এপিআই কন্ট্রোলার ModelStateব্যবহার করুন এবং যে কোনও উপায়ে আপনার ব্যবহার করা উচিত নয় সে সম্পর্কে ভুলে যান ।

পুরানো উত্তর:

এমভিসি-তে মডেলস্টেটটি মূলত কোনও মডেল অবজেক্টের অবস্থা বর্ণনা করার জন্য ব্যবহৃত হয় সেই বস্তুটি বৈধ কিনা তা সম্পর্কিত। এই টিউটোরিয়ালটি অনেক ব্যাখ্যা করা উচিত।

সাধারণত আপনার মডেলস্টেট সাফ করার দরকার নেই কারণ এটি আপনার জন্য এমভিসি ইঞ্জিন দ্বারা রক্ষণাবেক্ষণ করা হয়। এমভিসি বৈধতা সেরা অভ্যাসগুলি মেনে চলার চেষ্টা করার সময় ম্যানুয়ালি এটিকে সাফ করা অনাকাঙ্ক্ষিত ফলাফলের কারণ হতে পারে।

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


1
আমাকে আমার পরিষেবা স্তরকে কিছুটা পুনর্বিবেচনা করতে সাহায্য করে (কর্কশ তবে থেক্স) তবে নেটটিতে প্রচুর স্টাফ দেওয়ার সাথে সাথে এটি বৈধতার জন্য মডেলস্টেট ব্যবহারের দৃষ্টিভঙ্গির দিকে প্রবলভাবে ঝুঁকছে।
মিঃ গ্রোক

কেন আমি বিশেষভাবে মডেলস্টেট.ক্লেয়ার () এবং আমার জিজ্ঞাসার কারণ সম্পর্কে আমি আগ্রহী - এই প্রশ্নের জন্য আরও তথ্যের যোগ করা হয়েছে
মিঃ গ্রোক

5
একটি [এইচটিপিপি পোস্ট] ফাংশন থেকে ভিউ (...) ফিরিয়ে দেওয়া বন্ধ করার জন্য আমি এই যুক্তিটি সত্যই কিনছি না। আপনি যদি অজ্যাক্সের মাধ্যমে সামগ্রী পোস্ট করে থাকেন এবং ফলস্বরূপ আংশিক দর্শনের সাথে দস্তাবেজটি আপডেট করেন তবে এমভিসি মডেলস্টেটটি ভুল হিসাবে দেখানো হয়েছে। আমি খুঁজে পাওয়া একমাত্র কার্যকারক হ'ল এটি নিয়ন্ত্রণকারী পদ্ধতিতে সাফ করা।
অ্যারন হুডন

অ্যারোনহডন পিআরজি নিখুঁতভাবে প্রতিষ্ঠিত।
ম্যাট কোকাজ

যদি আমি একটি এজ্যাক কল দিয়ে পোস্ট করি তবে আমি কী জিইটি অ্যাকশনে পুনর্নির্দেশ করতে পারি এবং ওপি যেভাবে একটি মডেল ভরাট দেখতে পারি তা সমস্ত সংযোজকভাবে ফিরিয়ে দিতে পারি?
মায়ি

17

আপনি যদি কোনও পৃথক ক্ষেত্রের জন্য কোনও মান সাফ করতে চান তবে আমি নীচের কৌশলটি দরকারী বলে মনে করি।

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

দ্রষ্টব্য: আপনি যে ক্ষেত্রটি পুনরায় সেট করতে চান তার নাম "কী" পরিবর্তন করুন।


আমি জানি না কেন এটি আমার জন্য আলাদাভাবে কাজ করেছে (সম্ভবত এমভিসি 4)? তবে আমাকে মডেলও করতে হয়েছিল ey কেই = "" এর পরে। উভয় লাইন প্রয়োজন।
টিটিটি

আমি পিটারগলুক অপসারণের মন্তব্যে আপনাকে অভিনন্দন জানাতে চাই। এটি সম্পূর্ণ মডেলস্টেটটি সাফ করার চেয়ে ভাল (যেহেতু আমি রাখতে চাই এমন কিছু ক্ষেত্রে আমার ত্রুটি হয়েছে)।
তাজব

6

ভাল মডেলস্টেট মূলত বৈধতার ক্ষেত্রে মডেলটির বর্তমান রাজ্যটিকে ধারণ করে, এটি ধরে রাখে

ModelError Colલેક્શન: যখন মডেল মানগুলিকে আবদ্ধ করার চেষ্টা করে ত্রুটিগুলি উপস্থাপন করে। প্রাক্তন।

TryUpdateModel();
UpdateModel();

বা অ্যাকশনারসাল্টে প্যারামিটারের মতো

public ActionResult Create(Person person)

ভ্যালুপ্রোভিডারআরসাল্ট : মডেলটির সাথে চেষ্টা করার বাইন্ড সম্পর্কে বিশদটি ধরে রাখুন। প্রাক্তন। চেষ্টা করা মূল্য, সংস্কৃতি, কাঁচামাল

সাফ () পদ্ধতি অবশ্যই সাবধানতার সাথে ব্যবহার করা উচিত কারণ এটি অনির্দিষ্ট ফলাফলের দিকে নিয়ে যেতে পারে। এবং আপনি মডেলস্টেটের কিছু দুর্দান্ত সম্পত্তি হারাবেন যেমন অ্যাটেম্পটেডভ্যালু, এটি এমভিসি দ্বারা ব্যাকগ্রাউন্ডে ত্রুটির ক্ষেত্রে ফর্মের মানগুলি পুনরায় তৈরি করতে ব্যবহৃত হয়।

ModelState["a"].Value.AttemptedValue

1
হুমমম ... এটি হতে পারে যেখানে আমি এটির চেহারা দিয়ে বিষয়টি পাচ্ছি। আমি মডেলটির মূল্য পরীক্ষা করেছি eসিওটিটিল সম্পত্তি এবং এটি পরিবর্তিত হয়েছে তবে চেষ্টা করা মানটি হয়নি। দেখে মনে হচ্ছে এটি মানটিকে এমনভাবে আটকে দিচ্ছে যেন কোনও পৃষ্ঠা না থাকলেও পৃষ্ঠায় কোনও ত্রুটি রয়েছে (মডেলস্টেট অভিধানটি দেখেছেন এবং কোনও ত্রুটি নেই)।
মিঃ গ্রোক

6

আমার একটি উদাহরণ রয়েছে যেখানে আমি একটি অনুমোদিত ফর্মের মডেলটি আপডেট করতে চেয়েছিলাম এবং পারফরম্যান্সের কারণে 'অ্যাকশনে পুনর্নির্দেশ' করতে চাইনি। গোপন ক্ষেত্রগুলির পূর্ববর্তী মানগুলি আমার আপডেট হওয়া মডেলটিতে ধরে রাখা হয়েছিল - যা সকল প্রকারের সমস্যা সৃষ্টি করে !.

কোডের কয়েকটি লাইন শীঘ্রই মডেলস্টেটের মধ্যে থাকা উপাদানগুলি সনাক্ত করল যা আমি মুছে ফেলতে চেয়েছিলাম (বৈধতার পরে), সুতরাং ফর্মটিতে নতুন মানগুলি ব্যবহৃত হয়েছিল: -

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আপনার মডেল স্টেট এন্ট্রিটি সরিয়ে প্রথমে মডেল থেকে মানটি ব্যবহার করে কোনও লুকানো ইনপুট ক্ষেত্র তৈরি করতে আপনার ভিউতে ব্যবহার করা যেতে পারে। (অন্যান্য সহায়ক সম্প্রসারণ পদ্ধতিগুলির জন্য এটি সহজেই প্রসারিত হতে পারে)।

/// <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.ExpressionHelperমডেলস্টেট সম্পত্তির নাম পেতে ব্যবহার করে।


1
খুব সুন্দর! এক্সপ্রেশনহেল্প কার্যকারিতাটির জন্য এটিতে একটি ট্যাব রাখা।
জেরার্ড ওনিল

4

আমি মানটি আপডেট করতে বা পুনরায় সেট করতে চেয়েছিলাম যদি এটি বেশ কার্যকর হয় না, এবং এই সমস্যাটিতে চলে ran

মডেলস্টেট.সামোভের সহজ উত্তরটি হ'ল .. সমস্যাযুক্ত .. কারণ আপনি যদি সাহায্যকারীদের ব্যবহার করেন তবে আপনি নামটি সত্যই জানেন না (যদি আপনি নামকরণের সম্মেলনটি অনুসরণ না করেন)। যদি না আপনি সম্ভবত এমন কোনও ফাংশন তৈরি করেন যা আপনার কাস্টম উভয়ই সহায়ক এবং আপনার নিয়ামক নাম পেতে ব্যবহার করতে পারেন।

এই বৈশিষ্ট্যটি সহায়ক হিসাবে একটি বিকল্প হিসাবে প্রয়োগ করা উচিত ছিল, যেখানে ডিফল্টরূপে হয় না , তবে আপনি যদি অগ্রহণযোগ্য ইনপুটটিকে পুনরায় প্রদর্শন করতে চান তবে আপনি কেবল এটি বলতে পারেন।

তবে কমপক্ষে আমি এখন বিষয়টি বুঝতে পারি;)।


আমার ঠিক এটি করা দরকার; নীচে পোস্ট করা আমার পদ্ধতিগুলি দেখুন যা আমাকে Remove()সঠিক কীটি সাহায্য করেছে ।
টোবিয়াস জে

0

শেষে পেয়েছি। আমার কাস্টম মডেলবাইন্ডার যা নিবন্ধীকৃত ছিল না এবং এটি করে:

var mymsPage = new MyCmsPage();

NameValueCollection frm = controllerContext.HttpContext.Request.Form;

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

তাই কোনও কিছু যা ডিফল্ট মডেল বাঁধাই করছিল তা অবশ্যই সমস্যা তৈরি করছিল। কি তা নিশ্চিত নন তবে আমার সমস্যাটি এখন আমার কাস্টম মডেল বাইন্ডার নিবন্ধিত হওয়ায় কমপক্ষে এখন ঠিক হয়ে গেছে।


ভাল কাস্টম মডেলবাইন্ডারের সাথে আমার কোনও অভিজ্ঞতা নেই, পূর্বনির্ধারিতটি এখনও পর্যন্ত আমার প্রয়োজনের সাথে ফিট করে =)।
JOBG

0

সাধারণত, যখন আপনি নিজেকে কোনও কাঠামোর মানক অনুশীলনের বিরুদ্ধে লড়াই করতে দেখেন, তখন আপনার পদ্ধতির পুনর্বিবেচনা করার সময় এসেছে। এই ক্ষেত্রে, মডেলস্টেটের আচরণ। উদাহরণস্বরূপ, আপনি যখন কোনও পোস্টের পরে মডেল রাজ্যটি চান না, তখন পুনর্নির্দেশের বিষয়টি বিবেচনা করুন।

[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
}

এবং এখানে আমি কীভাবে রুটগুলি তারে আছি। রুটগুলি তৈরি করার পরে, আমি আমার সাবএজেন্ট (উদাহরণস্বরূপ / সাবজেন্ট 1, উদাহরণ.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()));
            }
        }

    }

আপনি পোষ্ট পুনর্নির্মাণ অনুশীলনটি খুব সঠিক পরামর্শ দিচ্ছেন, বাস্তবে আমি প্রায় প্রতিটি পোস্ট ক্রিয়াকলাপের জন্য এটি করি। তবে আমার একটি বিশেষ প্রয়োজন ছিল: পৃষ্ঠার উপরে আমার একটি ফিল্টার ফর্ম রয়েছে, শুরুতে এটি get সহ জমা দেওয়া হয়েছিল। তবে আমি একটি তারিখের ক্ষেত্রের সাথে আবদ্ধ না হয়ে একটি সমস্যায় পড়েছিলাম এবং পরে আবিষ্কার করেছি যে জিইটি অনুরোধগুলি সংস্কৃতিটি চারপাশে রাখে না (আমি আমার অ্যাপ্লিকেশনটির জন্য ফরাসি ব্যবহার করি), সুতরাং আমার তারিখটি সাফল্যের সাথে আবদ্ধ করার জন্য আমাকে অনুরোধটি পোষ্টটিতে স্যুইচ করতে হয়েছিল। তারপরে এই সমস্যাটি এসেছিল, আমি তাকে কিছুটা আটকে
রেখেছি

@ সৌহাইববেসবেস আপডেটগুলি দেখুন কীভাবে আমি সংস্কৃতি পরিচালনা করি showing
বি 2 কে

টেম্পাটাতে আপনার সংস্কৃতি সংরক্ষণ করা @ সোহাইববেস সম্ভবত কিছুটা সহজ। স্ট্যাকওভারফ্লো.com
বি 2 কে

0

ঠিক আছে, এটি আমার রেজার পৃষ্ঠাতে কাজ করেছে বলে মনে হয়েছিল এবং কখনও কখনও .cs ফাইলটিতে রাউন্ড ট্রিপও করেনি। এটি পুরানো এইচটিএমএল উপায়। এটি দরকারী হতে পারে।

<input type="reset" value="Reset">
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.