我有一个编辑表单,在保存结果时遇到问题。
查看:
<div class="editor-label">
@Html.LabelFor(model => model.LoginModel.Uzytkownik)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LoginModel.Uzytkownik)
@Html.ValidationMessageFor(model => model.LoginModel.Uzytkownik)
</div>
型号:
namespace Restauracja.Models
{
public class pracownikModel
{
public LoginModel LoginModel { get; set; }
public uzytkownikModel uzytkownikModle { get; set; }
public pracownikModel() {
LoginModel = new LoginModel();
uzytkownikModle = new uzytkownikModel();
}
}
public class LoginModel
{
[Required]
public string Uzytkownik { get; set; }
[Required]
public string Haslo { get; set; }
public string Konto { get; set; }
}
public class uzytkownikModel
{
[Required]
public string imie { get; set; }
....
}
}
控制器:
[HttpGet]
public ActionResult Edit(int LoginID)
{
pracownikModel prac = new pracownikModel();
var pr = (from p in baza.Logowanies where LoginID == p.LoginID select p).First();
prac.LoginModel.Uzytkownik = pr.Login;
return View(prac);
}
[HttpPost]
public ActionResult Edit(int LoginID, pracownikModel prac)
{
var xxx = (from z in baza.Logowanies where LoginID == z.LoginID select z).Single();
xxx.Login = prac.LoginModel.Uzytkownik;
baza.SubmitChanges();
return RedirectToAction("Index", "Foo");
}
[HttpGet]的功能正常,显示数据库的结果。问题是第二个函数... prac是null ...所以这不能工作因为我不能写入数据库的null。我不知道如何解决这个问题。
答案 0 :(得分:2)
我建议您在命名变量和类时仅使用标准的ASCII字母和数字。尝试从POST请求绑定属性时,默认模型绑定器使用这些名称。此外,由于这些属性名称被用作HTML中输入元素的名称和id属性,因此根据specification指出的无效HTML结果如下:
因此,您不应使用扩展的ASCII或unicode符号,例如ł
和ż
。将它们替换为相应的ASCII字符,默认的模型绑定器将能够正确获取值。
更新:
查看您在“编辑”视图中发送给我的示例代码后,您目前有3种表单:
@model Restauracja.Models.pracownikModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Edit</legend>
<div class="editor-label">
@Html.LabelFor(model => model.LoginModel.Uzytkownik)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LoginModel.Uzytkownik)
@Html.ValidationMessageFor(model => model.LoginModel.Uzytkownik)
</div>
</fieldset>
}
<table id="nostyle">
<tr>
<td>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<input type="submit" value="Save" />
}
</td>
<td>
@using (Html.BeginForm("Anuluj", "Pracownik", FormMethod.Post, new { id = "AnulujForm" }))
{
<input id="Anuluj" type="submit" value="Cancel" />
}
</td>
</tr>
</table>
第一个表单是唯一包含模型输入字段的表单。因此,只提交您可以期望在POST操作中填充模型的某些属性的第一个表单。不幸的是,第一个表单没有提交按钮,因此您无法提交。第二个和第三个表单包含提交按钮,但它们不包含任何输入字段,因此提交它们将使模型完全空白。
所以你需要的是在第一个表单中移动保存提交按钮:
@model Restauracja.Models.pracownikModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Edit</legend>
<div class="editor-label">
@Html.LabelFor(model => model.LoginModel.Uzytkownik)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LoginModel.Uzytkownik)
@Html.ValidationMessageFor(model => model.LoginModel.Uzytkownik)
</div>
</fieldset>
@:<table id="nostyle">
@:<tr>
@:<td>
<input type="submit" value="Save" />
@:</td>
}
<td>
@using (Html.BeginForm("Anuluj", "Pracownik", FormMethod.Post, new { id = "AnulujForm" }))
{
<input id="Anuluj" type="submit" value="Cancel" />
}
</td>
</tr>
</table>
或者由于“取消提交”按钮当前发布到控制器操作,执行重定向,您只需将其替换为将重定向的锚点:
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Edit</legend>
<div class="editor-label">
@Html.LabelFor(model => model.LoginModel.Uzytkownik)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LoginModel.Uzytkownik)
@Html.ValidationMessageFor(model => model.LoginModel.Uzytkownik)
</div>
</fieldset>
<table id="nostyle">
<tr>
<td>
<input type="submit" value="Save" />
</td>
<td>
@Html.ActionLink("Cancel", "zarzadzaj_pracownikami", "Pracownik")
</td>
</tr>
</table>
}