2011-11-18 35 views
1

我有一個編輯窗體,並且在保存結果時遇到問題。編輯操作中的可爲空值

檢視:

<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]工作正常,示出了從數據庫的結果。問題是與第二個功能...普拉克是空的...所以這不能工作,因爲我不能寫空數據庫。我不知道如何解決這個問題。

+1

使用特殊字符函數/變量名是一個可怕的想法 – matino

+0

如果你使用會發生什麼:''爲POST方法公衆的ActionResult編輯(pracownikModel PRAC)?刪除LoginID。 –

+1

我同意@matino。嘗試將特殊字符改爲類似的東西。這可能是你的問題的根源。除此之外,LoginID的目的是什麼。您不會將其存儲在視圖的隱藏字段中,並且它將返回爲空。嘗試刪除,如果你不需要它在基於HttpPost的行動。 –

回答

2

我建議你在命名變量和類時只使用標準的ASCII字母和數字。當試圖綁定來自POST請求的屬性時,默認模型綁定器使用這些名稱。

  • ID和名稱標記必須以字母開頭([A:還因爲這些屬性名稱根據其中規定的specification用作你結束了無效的HTML HTML中的輸入元素的名稱和id屬性),可以跟隨任意數量的字母,數字([0-9]),連字符(「 - 」),下劃線(「_」),冒號(「:」)和句點(「 「)。

所以你不應該使用擴展的ASCII或unicode符號,如łż。將它們替換爲相應的ASCII字符,默認的模型聯編程序將能夠更正提取值。


UPDATE:

看着你送我在你編輯視圖中的示例代碼後,你目前有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> 
} 
+0

我將所有特殊的charakters更改爲標準ASCII,但這並不能解決問題。 – user1031034

+0

@ user1031034,我剛剛測試了你的代碼,它對我有用。 –

+0

所以我不明白這...爲什麼這不起作用...;/ – user1031034