2012-03-07 79 views
0

我在我的應用程序中構建驗證表單。在這種形式中有兩個按鈕。一個接受,一個拒絕。當用戶按拒絕時,必須提供拒絕原因字段。我檢查這個serverside。 我首先檢查按下了哪個按鈕,然後如果該字段爲空,則向modelstate添加moddel錯誤。但是,因爲表單中的所有字段都是隻讀的,所以這些字段不會發布回服務器,因此,當我將視圖返回給用戶時,沒有數據。我可能錯過了一些明顯的東西,但無法找到該做什麼。 (我知道我可以在我的形式各領域隱藏的,但由於大量的領域,這將是十分可怕的)asp.net mvc Serverside驗證不返回數據

這是我的代碼。

[HttpPost] 
    public virtual ActionResult Validate(string action, Record dto) { 

     if(action == Global.Accept) { 
      ciService.Store(dto); 
      return RedirectToAction("Index", "Ci"); 
     } else { 
      if(string.IsNullOrEmpty(dto.RejectionReason)) { 
       ModelState.AddModelError("RejectionReason", "REQUIRED!!!!"); 
       return View("Validate", dto); 


      } 
      ciService.Reject(dto); 
      return RedirectToAction("Index", "Ci"); 
     } 
    } 
+0

我可以建議做兩個行動方法,一個接受和一個拒絕。名爲Validate的動作似乎不適合做ciService.Store(dto); – labroo 2012-03-07 17:41:16

+0

'readonly'字段是什麼意思?有'readonly'和'disabled'屬性可以在你的輸入標籤上使用嗎?這是你在說什麼嗎?請注意,雖然這兩個屬性都阻止用戶修改這些字段中的值,但不同之處在於,只讀輸入字段仍將其值發佈到服務器,而「禁用」字段則不是這種情況。 – 2012-03-07 17:42:00

+0

@DarinDimitrov我認爲他意味着模型類上的字段是隻讀的。默認MVC模板然後只顯示它們作爲文本而不是HTML表單字段 – 2012-03-07 17:43:53

回答

2

您需要重新從數據庫模型,然後進行更改以匹配任何改變被髮布在dto。然後在視圖中使用該組合模型。

+0

用戶只能填寫一個字段,所以這就是我所做的。謝謝 – Patrick 2012-03-07 20:21:53

0

您需要隱藏字段與UI中顯示的每個屬性相對應。

例如,

@ Html.LabelFor(M => m.MyProperty) - 對於展示

@ Html.Hiddenfor(M => m.MyProperty) - ToPostback值到服務器

0

如果我理解正確,問題是因爲您不使用輸入。 解決您的問題插入一些輸入藏在你的形式與大家需要傳遞給控制器​​

@Html.HiddenFor(model => model.Myfield1) 
@Html.HiddenFor(model => model.Myfield2) 

應該固定值不是如果你不回傳給你的行動

0

值需要服務器端的這些字段,只需創建一個新的ViewModel RecordValidateViewModel,並且這隻包含需要驗證的字段。模型聯編程序將隨後填充,您將只對該模型中的字段進行驗證,而不是您在其中似乎並不需要的所有其他字段。

如果你需要他們來驗證,然後張貼到服務器。它隱藏起來並不「醜陋」。

1

而不是從瀏覽器傳遞DTO背面的,我會用一個隱藏的HTML字段或含有標識DTO的ID的查詢參數。那麼你的POST操作方法看起來是這樣的:

[HttpPost] 
public virtual ActionResult Validate(string action, int id) 
{ 
    // reload the DTO using the id 
    // now you have all the data, so just process as you did in your question 

    if (action == Global.Accept) { ... } 
    ... 
} 

你的GET方法可能看起來像那麼下面...

[HttpGet] 
public virtual ActionResult Validate(int id) 
{ 
    // load the DTO and return it to the view 

    return View(); 
} 

這樣,你有你所需要的中的數據你的POST動作方法可以做任何你需要的。