我面临一个奇怪的问题,即MVC保留了一个不正确的int值,尽管它在控制器动作中被明确设置。
我的客户端控制器操作的一部分涉及在客户端名称已更改时创建新客户端,并将原始客户端设置为已删除(是的,软删除可能不好,我知道)。我的存储库方法使用nHibernate将客户端插入到数据库中并返回标识值(Client.ClientId)。我可以看到我的ViewModel具有正确的(新的)ClientId值,但在回发到视图后,将保留不正确的(旧)ClientId。我可以在Chrome检查器的隐藏输入中看到它。
这是我的控制器代码:
[CustomAuthorization]
// GET: /Clients/Client/id
public ActionResult Client(int? id)
{
if (id != null)
{
var viewModel = new ClientDetailViewModel();
var client = new EntityManager<Client>().GetById(id.Value);
viewModel.ClientList = Repository.GetClientList(client).ToList();
//do more stuff...
return View(viewModel);
}
return RedirectToAction("Index");
}
[CustomAuthorization]
[HttpPost]
public ActionResult Client(ClientDetailViewModel _viewModel)
{
if (ModelState.IsValid)
{
//Get persistent client from db
var pClient = new EntityManager<Client>().GetById(_viewModel.Client.ClientId);
//check if client name has changed
if (_viewModel.Client.OrgName != pClient.OrgName)
{
//sets the persistent client as deleted, inserts the viewmodel client
//and sets _viewModel.Client.ClientId to the identity value
_viewModel.Client = Repository.ChangeClientName(_viewModel.Client, pClient);
}
//do some more stuff...
}
//the value of _viewModel.Client.ClientId is now the correct (new) one in debug
return View(_viewModel);
}
以下是相关的客户端类和属性。
public class Client {
public Client() {}
public virtual int ClientId { get; set; }
}
我的观点如下:
@using (Html.BeginForm("Client", "Clients", FormMethod.Post, new { @class="check-leave", @id = "clientedit_form" }))
{
@Html.HiddenFor(m => m.Client.ClientId)
@Html.EditorFor(m => m.Client)
//a lot more html helpers and js...
}
我意识到使用RedirectToAction是一个更好的主意,因为我们正在处理一个新的客户端,所以我尝试了下面的代码。但是,尽管在调试时看到了正确的新ClientId,但客户端获取操作仍然会收到旧的不正确的ClientId。
if (_viewModel.Client.OrgName != pClient.OrgName)
{
_viewModel.Client = Repository.ChangeClientName(_viewModel.Client, pClient);
return RedirectToAction("Client",_viewModel.Client.ClientId);
}
我唯一能想到的是,尽管我在控制器中所做的事情,POST参数仍然保持旧值。