“编辑操作”中的可为空值

时间:2011-11-18 15:14:36

标签: asp.net-mvc-3 linq-to-sql razor edit

我有一个编辑表单,在保存结果时遇到问题。

查看:

<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。我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

我建议您在命名变量和类时仅使用标准的ASCII字母和数字。尝试从POST请求绑定属性时,默认模型绑定器使用这些名称。此外,由于这些属性名称被用作HTML中输入元素的名称和id属性,因此根据specification指出的无效HTML结果如下:

  • ID和NAME令牌必须以字母([A-Za-z])开头,后面可以跟任意数量的字母,数字([0-9]),连字符(“ - ”),下划线(“ _“),冒号(”:“)和句号(”。“)。

因此,您不应使用扩展的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>
}