我有一个视图,该视图在具有复选框的表上显示记录,供用户选择和更新。但是,如果我在表中有3条记录,即Data [0],Data [1],Data [2],而我只选择了Data [0]的复选框,并将其发布到控制器,则在返回屏幕时,Data [1]复选框现在具有已提交(store
)的Data [0]状态。但是,数据库显示Data [1]的复选框值为0(假)。我唯一的猜测是与模型绑定有关,否则我将需要坚持该复选框说明某些方式。
型号
true
GET方法
public class DrinkingWaterModel
{
//contains all properties of the FPDrinkingWater Entity
public List<FPDrinkingWater> Data { get; set; }
public AlertModel SuccessAlert { get; set; }
public AlertModel FailureAlert { get; set; }
}
视图
public async Task<ActionResult> UnverifiedDrinkingWaterLog(AlertModel
successAlert, AlertModel failureAlert)
{
//get unverified data from the db
var data = (from s in await Manager.Store.GetAllAsync<FPDrinkingWater>()
where s.Verified.Equals(false)
select s).ToList();
//fill the model
DrinkingWaterModel model = new DrinkingWaterModel
{
SuccessAlert = successAlert,
FailureAlert = failureAlert,
Data = data
};
return PartialView("_UnverifiedFPDrinkingWaterTable", model);
}
POST方法
@model MyApplication.Areas.FP.Models.DrinkingWaterModel
@{
Layout = null;
}
<div>
@Html.AntiForgeryToken()
<table id="UnverifiedDrinkingWaterTable" class="table table-hover">
<thead>
<tr>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().SID)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Location)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Replicate)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionDate)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().CollectionTime)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Collectors)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Clorinated)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Comments)</th>
<th>@Html.LabelFor(m => m.Data.FirstOrDefault().Verified)</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Data.Count(); i++)
{
<tr>
@Html.HiddenFor(m => m.Data[i].Id)
@Html.HiddenFor(m => m.Data[i].SID)
<td>@Html.DisplayFor(m => m.Data[i].SID)</td>
@Html.HiddenFor(m => m.Data[i].Location)
<td>@Html.DisplayFor(m => m.Data[i].Location)</td>
@Html.HiddenFor(m => m.Data[i].Replicate)
<td>@Html.DisplayFor(m => m.Data[i].Replicate)</td>
@Html.HiddenFor(m => m.Data[i].CollectionDate)
<td>@Html.DisplayFor(m => m.Data[i].CollectionDate)</td>
@Html.HiddenFor(m => m.Data[i].CollectionTime)
<td>@Html.DisplayFor(m => m.Data[i].CollectionTime)</td>
@Html.HiddenFor(m => m.Data[i].Collectors)
<td>@Html.DisplayFor(m => m.Data[i].Collectors)</td>
@Html.HiddenFor(m => m.Data[i].Clorinated)
<td>@Html.DisplayFor(m => m.Data[i].Clorinated)</td>
@Html.HiddenFor(m => m.Data[i].Comments)
<td>@Html.DisplayFor(m => m.Data[i].Comments)</td>
<td>@Html.EditorFor(v => v.Data[i].Verified) </td>
</tr>
}
@if (Model.Data.Count() == 0)
{
<tr>
<td colspan="@Html.ColumnCount(9)"><em>No Drinking Water data to verify.</em></td>
</tr>
}
</tbody>
</table>
@if (verify)
{
<button type="submit" class="btn btn-primary" data-loading-text="Verifying...">Verify</button>
}
</div>
<script>
$(document).ready(function () {
makeDataTable('UnverifiedDrinkingWaterTable')
});
$('#RefreshDrinkingWater').click();
</script>
答案 0 :(得分:1)
该值未更新,因为它是由ModelState
而不是模型读取的。 Check out和一些related questions可以更好地了解此功能的存在原因。简短的版本是,如果有需要纠正的错误,通常只从POST
返回完全相同的页面。通过阅读ModelState
,您可以为用户提供保持先前输入的好处。
解决此问题的两种方法:
ModelState.Clear();
操作中调用HttpPost
。就个人而言,我不推荐这样做,但这是一个选择。ModelState
有效,请按照Post-> Redirect-> Get模式,然后将RedirectToAction
调用到您原来的HttpGet
方法。如果ModelState
不是有效,请执行您正在执行的操作,以便显示错误消息并保留用户输入。