MVC 4 @HTML.HiddenFor 不会在回发时更新 [英] MVC 4 @HTML.HiddenFor are not updating on a postback

查看:31
本文介绍了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屋!

查看全文
相关文章
C#/.NET最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆