এই কোড কাজ করবে না
// remove the Step variable from the model state
// if you want the changes in the model to be
// taken into account
ModelState.Remove("Step");
model.Step = 2;
... কারণ হাইডফোর্ড সর্বদা (!) মডেলস্টেট থেকে পড়ে মডেল নয়। এবং যদি এটি "পদক্ষেপ" কীটি না খুঁজে পায় তবে এটি সেই পরিবর্তনশীল প্রকারের জন্য ডিফল্ট উত্পাদন করে যা এই ক্ষেত্রে 0 হবে
সমাধান এখানে। আমি এটি নিজের জন্য লিখেছি তবে এটি ভাগ করে নিতে কিছু মনে করবেন না কারণ আমি দেখতে পাচ্ছি যে অনেক লোক এই দুষ্টু হিডফর্ডের সহায়তার সাথে লড়াই করছে।
public static class CustomExtensions
{
public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
ReplacePropertyState(htmlHelper, expression);
return htmlHelper.HiddenFor(expression);
}
public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
{
ReplacePropertyState(htmlHelper, expression);
return htmlHelper.HiddenFor(expression, htmlAttributes);
}
public static MvcHtmlString HiddenFor2<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
{
ReplacePropertyState(htmlHelper, expression);
return htmlHelper.HiddenFor(expression, htmlAttributes);
}
private static void ReplacePropertyState<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
string text = ExpressionHelper.GetExpressionText(expression);
string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(text);
ModelStateDictionary modelState = htmlHelper.ViewContext.ViewData.ModelState;
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
if (modelState.ContainsKey(fullName))
{
ValueProviderResult currentValue = modelState[fullName].Value;
modelState[fullName].Value = new ValueProviderResult(metadata.Model, Convert.ToString(metadata.Model), currentValue.Culture);
}
else
{
modelState[fullName] = new ModelState
{
Value = new ValueProviderResult(metadata.Model, Convert.ToString(metadata.Model), CultureInfo.CurrentUICulture)
};
}
}
}
তারপরে আপনি যা দেখেন তার মধ্যে থেকে এটি যথারীতি ব্যবহার করুন:
@Html.HiddenFor2(m => m.Id)
এটি উল্লেখ করার মতো এটি সংগ্রহের সাথেও কাজ করে।