我有一个视图,它在带有复选框的表上显示记录,供用户选择和更新。但是,如果我在表中有 3 条记录 Data[0]、Data[1]、Data[2] 并且我只选中 Data[0] 的复选框并将其 POST 到控制器,那么当屏幕返回 Data [1] 复选框现在具有已提交 ( true
)的 Data[0] 状态。但是,数据库显示 Data[1] 的复选框值为 0(假)。我唯一的猜测是模型绑定,或者我需要保留复选框说明一些如何。
模型
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);
}
风景
@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>
POST方法
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> VerifyDrinkingWater([System.Web.Http.FromBody] DrinkingWaterModel model)
{
var successAlert = new AlertModel();
var failureAlert = new AlertModel();
if (ModelState.IsValid)
{
List<string> successes = new List<string>();
List<string> failures = new List<string>();
foreach (var verifiable in model.Data)
{
if (verifiable.Verified != false)
{
verifiable.Verified = true;
verifiable.VerifiedDate = DateTime.Now;
verifiable.VerifiedBy = User.Identity.Name;
var result = await Manager.VerifyAsync(verifiable);
}
}
}
else
{
InvalidState(failureAlert);
}
//return the GET method to update and refresh the table
return await UnverifiedDrinkingWaterLog(successAlert, failureAlert);
}
该值未更新,因为它正在被读取ModelState
而不是模型读取。查看一些相关问题以更好地了解此功能存在的原因。简短的版本是,POST
如果存在需要更正的错误,通常您只会从 a 返回完全相同的页面。通过阅读ModelState
你给用户保留他们以前输入的好处。
解决此问题的两个选项:
ModelState.Clear();
您的HttpPost
操作。我个人不推荐这个,但它是一种选择。ModelState
有效,请遵循 Post -> Redirect -> Get 模式并调用RedirectToAction
原始HttpGet
方法。如果ModelState
是不是有效的,那么你在做什么,这样你就可以显示错误信息,并保持用户输入。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句