Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 从Post返回后,绑定到视图模型的MVC3 Razor-TextBoxFor()值未正确更新_Asp.net Mvc 3_C# 4.0_Razor - Fatal编程技术网

Asp.net mvc 3 从Post返回后,绑定到视图模型的MVC3 Razor-TextBoxFor()值未正确更新

Asp.net mvc 3 从Post返回后,绑定到视图模型的MVC3 Razor-TextBoxFor()值未正确更新,asp.net-mvc-3,c#-4.0,razor,Asp.net Mvc 3,C# 4.0,Razor,“我的视图”在html表中显示一系列行。这些行按数据库中的排名顺序排列。html表中的一列是一个文本框,允许用户修改此排名顺序。表格底部有一个更新提交按钮,允许用户保存此新订单。我遇到的问题是,排名顺序正确地更新到数据库中,但是当控制器返回到视图时,屏幕上的所有数据都正确地更新了,但是文本框中的值没有更新 Order | Data ================================================ 10 | Item 1 20

“我的视图”在html表中显示一系列行。这些行按数据库中的排名顺序排列。html表中的一列是一个文本框,允许用户修改此排名顺序。表格底部有一个更新提交按钮,允许用户保存此新订单。我遇到的问题是,排名顺序正确地更新到数据库中,但是当控制器返回到视图时,屏幕上的所有数据都正确地更新了,但是文本框中的值没有更新

Order   |  Data     
================================================
10      |  Item 1
20      |  Item 2
30      |  Item 3

Lets say the user makes the following changes
Order   |  Data
================================================
50      |  Item 1
20      |  Item 2
10      |  Item 3

Now User hits update and what is rendered is:

Order   |  Data
================================================
50      |  Item 3
20      |  Item 2
10      |  Item 1

(Note data was sorted correctly but values of TextBoxFor did not update)
我的视图代码

@using (Html.BeginForm("UpdateRanks", "MyController")) {
    <table cellpadding="0" cellspacing="0" width="100%">
    @for (int i = 0; i < Model.DbSelections.Count; i++) {
       var item = Model.DbSelections[i];
       <tr>
        <td>
            @Html.TextBoxFor(m => m.DbSelections[i].Rank, new { @class = "NarrowTextBox" })
        </td>
        <td>
            @Model.DbSelections[i].Rank (works!), @item.ItemName<br />
        </td>
       </tr>
    }
    <input type="submit" value="Update" name="updateaction"  class="StandardButton"/>
</table>
}
使用(Html.BeginForm(“UpdateRanks”、“MyController”)){ @for(int i=0;im.DbSelections[i].Rank,new{@class=“窄带文本框”}) @Model.dbs[i].排名(有效!),@item.ItemName
} } 控制器代码:

[HttpPost]
[MultiButton(MatchFormKey = "updateaction", MatchFormValue = "Update")]
public ActionResult UpdateRanks(MyViewModel model) {

    if (ModelState.IsValid) {

        MyRepository myRepo = new MyRepository();
        <!-- saves updated ranks to database - it works -->
        myRepo.UpdateAutoPicks(...);

        <!-- after saved ranks above, now reload data including ranks from database -->
        <!-- debugging shows that data and ranks and ordering is correct->
        model.DbSelections = myRepo.GetItems();

        return View("Index", model);


    } else {
        <!-- blah -->
    }

    return View("Index", model);
}
[HttpPost]
[多按钮(MatchFormKey=“updateaction”,MatchFormValue=“Update”)]
公共操作结果更新程序(MyViewModel模型){
if(ModelState.IsValid){
MyRepository myRepo=新建MyRepository();
myRepo.UpdateTopicks(…);
}
返回视图(“索引”,模型);
}
看看这个是否能帮到你


使用此解决方案的一个警告是,您将丢失使用TextBoxFor()的任何内置功能,例如验证。如果这不起作用,您可以尝试使用ModelState.Clear()清除发布的值(有关更多详细信息,请参阅)。

我遇到了相同的问题,控制器中的ModelState.Clear()解决了此问题。但是,我不确定这样做是否正确。

您不必清除整个ModelState,只需清除您希望更新的ModelState。。。 这可能会减少不必要的副作用:

例如,我有一段代码将用户提供的电话号码格式化为美国10位数格式,而不仅仅是验证它。这将在以下位置返回此字段的“已清除”值:

ModelState[“Phone”].Value=新的ValueProviderResult(dummyph,dummyph,System.Globalization.CultureInfo.CurrentUICulture)