MVC 4 @HTML.HiddenFor 不会在回发时更新
[英] MVC 4 @HTML.HiddenFor are not updating on a postback
本文介绍了MVC 4 @HTML.HiddenFor 不会在回发时更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在一系列页面视图中出现视图状态问题 -- 在 Razor 中页面的初始视图中,我使用 Html.HiddenFor
如下:
@Html.HiddenFor(x => Model.err)@Html.HiddenFor(x => Model.errField)@Html.HiddenFor(x => Model.errMessage)@Html.HiddenFor(x => Model.IsMove)
这似乎工作正常.我隐藏的输入标签包含正确的值.但是,当我提交表单 [HTTPPost]
并使用...更新我的控制器操作中的模型时.
model.err = transHelper.err;模型.errField = transHelper.errField;模型.errMessage = transHelper.errMessage;返回视图(模型);
隐藏字段似乎没有更新,它们包含初始视图中的原始值.但是,当我在同一个剃刀视图中的另一个上下文中使用这些字段时...
@*这似乎没有正确更新...@Html.HiddenFor(x => Model.err)@Html.HiddenFor(x => Model.errField)@Html.HiddenFor(x => Model.errMessage)@Html.HiddenFor(x => Model.IsMove)*@<input type="hidden" id="err" value="@Model.err"/><input type="hidden" id="errField" value="@Model.errField"/><input type="hidden" id="errMessage" value="@Model.errMessage"/><input type="hidden" id="IsMove" value="@Model.IsMove"/>
然后输入字段正确更新.我什至创建了一个视图助手来帮助调试,在所有情况下,模型似乎在 HtmlHelper
中有正确的数据——我什至将模型返回为 return Json(model);
并且数据很好.
此时我正在解决这个问题,但有人知道为什么 @Html.HiddenFor
很脏.
更新:这是我的控制器操作
[HttpPost]公共 ActionResult 索引(HomePageModel 模型){//处理事务交易者 transr = new Transactionr();transr.Process(模型);模型.err = transr.err;模型.errField = transr.errField;模型.errMessage = transr.errMessage;返回视图(模型);}
这是我的观点:
@model App.Models.HomePageModel@{ViewBag.Title = "产品分类器";}<form id="formData" method="post" action="/Home/Index">@Html.AntiForgeryToken()<字段集><div>@Html.HiddenFor(model => model.err)@Html.HiddenFor(model => model.errField)@Html.HiddenFor(model => model.errMessage)@Html.HiddenFor(model => model.IsMove)<input type="hidden" id="myerr" value="@Model.err"/><input type="hidden" id="myerrField" value="@Model.errField"/>
<div class="section group"><div class="col span_2_of_2"><div class="message" id="message">@if (Model.err <0){<span style="color: Purple;">@Model.errMessage (@Model.err) - (@Model.errField)</span>}否则如果(Model.err > 0){<span style="color:red;">@Model.errMessage (@Model.err) (@Model.errField)</span>} 别的 {<span>@Model.errMessage (@Model.err) (@Model.errField)</span>}
<div class="section group" id="workspace">@Html.Partial("_WorkspacePartial", 模型)
<div class="section group" id="details">@Html.Partial("_DetailPartial", 模型)
</fieldset></表单>
这是我的模型:
公共类 HomePageModel{公共 int FromStore { 获取;放;}//复制/移动事务的To"部分公共 int ToStore { 获取;放;}//复制/移动事务的列表公共列表详情{获取;放;}//true 是移动 false 是复制public bool IsMove { 获取;放;}//当前消息公共国际错误{得到;放;}公共 int errField { 获取;放;}公共字符串 errMessage { 获取;放;}
解决方案
默认的 HtmlHelpers 行为(@Html.HiddenFor 等)的行为与您所描述的完全相同.
即您在帖子上对 ViewModel 所做的任何更改都会被执行,您从帖子返回的任何更改都会被视图接收,但是在使用 HTMLHELPERS 重新渲染时,之前的 Post 值优先于更改后的 ViewModel 值.
想要以一种快速+肮脏的方式修复"这种行为,在从 HttpPost ActionMethod 返回之前清除 ModelState.Clear() !
Having issues with the view state on a series of page views -- On the initial view of a page in Razor I am using Html.HiddenFor
as follows:
@Html.HiddenFor(x => Model.err)
@Html.HiddenFor(x => Model.errField)
@Html.HiddenFor(x => Model.errMessage)
@Html.HiddenFor(x => Model.IsMove)
which seems to work fine. My hidden input tags contain the correct values. However when I submit the form [HTTPPost]
and update the model in my controller action with..
model.err = transHelper.err;
model.errField = transHelper.errField;
model.errMessage = transHelper.errMessage;
return View(model);
The hidden fields do not seem to update, they contain the original values from the initial view. However When I use these fields in another context within the same razor view like this...
@*
this seems to not update correctly...
@Html.HiddenFor(x => Model.err)
@Html.HiddenFor(x => Model.errField)
@Html.HiddenFor(x => Model.errMessage)
@Html.HiddenFor(x => Model.IsMove)
*@
<input type="hidden" id="err" value="@Model.err" />
<input type="hidden" id="errField" value="@Model.errField" />
<input type="hidden" id="errMessage" value="@Model.errMessage" />
<input type="hidden" id="IsMove" value="@Model.IsMove" />
</div>
Then the input fields update correctly. I even created a View Helper to help debug, and in all cases, the Model seems to have correct data in HtmlHelper<TModel>
-- I even returned the Model as return Json(model);
and the data was fine.
At this point I am running with the work around, but does anybody know why @Html.HiddenFor
is dirty.
Update: here is my controller actions
[HttpPost]
public ActionResult Index(HomePageModel model)
{
// process transaction
Transactionr transr = new Transactionr();
transr.Process(model);
model.err = transr.err;
model.errField = transr.errField;
model.errMessage = transr.errMessage;
return View(model);
}
Here is my view:
@model App.Models.HomePageModel
@{
ViewBag.Title = "Product Categorizer";
}
<form id="formData" method="post" action="/Home/Index">
@Html.AntiForgeryToken()
<fieldset>
<div>
@Html.HiddenFor(model => model.err)
@Html.HiddenFor(model => model.errField)
@Html.HiddenFor(model => model.errMessage)
@Html.HiddenFor(model => model.IsMove)
<input type="hidden" id="myerr" value="@Model.err" />
<input type="hidden" id="myerrField" value="@Model.errField" />
</div>
<div class="section group">
<div class="col span_2_of_2">
<div class="message" id ="message">
@if (Model.err < 0)
{
<span style="color: purple;">@Model.errMessage (@Model.err) - (@Model.errField)</span>
}
else if (Model.err > 0)
{
<span style="color:red;">@Model.errMessage (@Model.err) (@Model.errField)</span>
} else {
<span>@Model.errMessage (@Model.err) (@Model.errField)</span>
}
</div>
</div>
</div>
<div class="section group" id="workspace">
@Html.Partial("_WorkspacePartial", Model)
</div>
<div class="section group" id="details">
@Html.Partial("_DetailPartial", Model)
</div>
</fieldset>
</form>
Here is my model:
public class HomePageModel
{
public int FromStore { get; set; }
// the "To" part of the copy/move transaction
public int ToStore { get; set; }
// a list of the copy/move transaction
public List<int> Details { get; set; }
// true is move false is copy
public bool IsMove { get; set; }
// current message
public int err { get; set; }
public int errField { get; set; }
public string errMessage { get; set; }
解决方案
The default HtmlHelpers behavior (@Html.HiddenFor, etc) is to behave exactly as you have described.
i.e. any changes you make to the ViewModel on a post are actioned, any changes you return from the Post are received by the view, but on re-rendering WITH HTMLHELPERS, the previous Post-values take precedence over the changed ViewModel values.
Want to "fix" this behavior in a quick + dirty way, clear the ModelState.Clear() prior to returning from the HttpPost ActionMethod !
这篇关于MVC 4 @HTML.HiddenFor 不会在回发时更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文