2014-10-29 17 views
1

我有超過40個領域的大視野。其中一些字段是下拉列表,我使用selectlistitems列表填充。模型狀態無效:當我有dropdownlists時如何返回查看?

我使用我的視圖模型的註釋,使他們中的一些要求。

現在,我想使ModelState.IsValid檢查,並返回到出現問題的獨到見解,如果有一些錯誤。

問題是,如果我只是簡單地創建一個return View(model),我所有的下拉列表都會使網站崩潰,因爲它們需要再次填充才能加載頁面。

所以我的問題是:如何處理返回時的ModelState是無效的。

我的控制器:

public ActionResult CreateSelling(SellingAdViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      SellingAdvert sellingAdvert = setSellingAd(model); 

      var stored_advert = sellingAdvertService.Create(sellingAdvert); 



      if (User != null && User.Identity.IsAuthenticated) 
      { 
       if (model.AcceptPartner) 
       { 
        notifyPartner(stored_advert); 
       } 

       return RedirectToAction("Upgrade", "Ads", new { AdvertID = stored_advert.Id }); 
      } 
      else 
      { 
       return RedirectToAction("ActivateAnonymous", "Ads", new { AdvertID = stored_advert.Id, anonymousId = model.UserId, AdvertType = "selling" }); 
      } 
     } 

     return View(model); 
    } 

我的視圖模型(我有一個從這個派生的SellingAdViewModel並添加更多的特性):

public class BasicAdViewModel 
{ 
    public int SectorId { get; set; } 
    public Guid UserId { get; set; } 
    public bool IsAnonymousUser { get; set; } 
    public int AdvertId { get; set; } 

    [DisplayName("Titel:")] 
    [Required(ErrorMessage = "Titel skal udfyldes")] 

    public string Headline { get; set; } 

    [DisplayName("Beskrivelse:")] 
    [StringLength(50, ErrorMessage = "Beskrivelsen minimum fylde 50 karakterer")] 
    public string Description { get; set; } 

    [DisplayName("Søgeord:")] 
    public string SearchWords { get; set; } 


    [DisplayName("Undertitel:")] 
    public string Subtitle { get; set; } 

    [DisplayName("Type af drift")] 
    public List<SelectListItem> OperationTypes { get; set; } 

    [Required] 
    public int SelectedOperationTypeId { get; set; } 


    [Required] 
    public int SelectedSectorId { get; set; } 
    public IEnumerable<GroupedSelectListItem> Sectors { get; set; } 
} 

設置我dropdownlists擺在首位:

我的模型有List<SelectListItem> p roperties,我填充它們具有幾個輔助方法:

SellingAdViewModel model = new SellingAdViewModel() 
      { 
       BusinessEntityTypes = ModelListHelpers.GetBusinessEntityTypes(), 
       FoundedYears = ModelListHelpers.GetFoundedYears(null), 
       ReasonForSale = ModelListHelpers.GetReasonForSale(), 
       RevenuePrediction = ModelListHelpers.GetRevenuePrediction(), 
       RevenueStatus = ModelListHelpers.GetRevenueStatus(), 
       OperationTypes = ModelListHelpers.GetOperationTypes(), 
       Region = ModelListHelpers.GetRegions(), 
       Turnover = ModelListHelpers.Turnovers(), 
       OperatingIn = ModelListHelpers.OperatingIn(), 
       AmountOfEmployees = ModelListHelpers.GetAmountOfEmployees() 
      }; 
+0

我通常把下拉的TempData的名單,然後如果我的ModelState中是無效的,我從TempData的讓他們再拍model.dropdown =(類型)的TempData [「下拉菜單」]; – theLaw 2014-10-29 10:38:13

+0

你如何填充你的dropdownlist第一次?在適當的地方使用'ViewBag'做同樣的事情。 (即在行動中可能會)。我這樣做。 (在我看來,'viewbag'項目,如selectlistitems) – Zeeshan 2014-10-29 10:42:15

+0

我只是說我該怎麼填我的視圖模型:)我這樣做對HTTPGET電話,我在那裏設置SelectListItems – 2014-10-29 10:46:32

回答

3

我建議你這個解決方案置於TempData模型的GET操作過程中如果模型狀態是無效的,你作出這樣

分配
public ActionResult CreateSelling(SellingAdViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     SellingAdvert sellingAdvert = setSellingAd(model); 

     var stored_advert = sellingAdvertService.Create(sellingAdvert); 



     if (User != null && User.Identity.IsAuthenticated) 
     { 
      if (model.AcceptPartner) 
      { 
       notifyPartner(stored_advert); 
      } 

      return RedirectToAction("Upgrade", "Ads", new { AdvertID = stored_advert.Id }); 
     } 
     else 
     { 
      return RedirectToAction("ActivateAnonymous", "Ads", new { AdvertID = stored_advert.Id, anonymousId = model.UserId, AdvertType = "selling" }); 
     } 
    } 

    model.YourList = TempData.Peek("YourList"); 
    return View(model); 
} 
+1

這不是一個好的解決方案。如果用戶刷新頁面,那麼'TempData'將爲空,並拋出異常。至於建議的鏈接,它什麼都沒有用這個做(除非OP要渲染的隱藏輸入每個'SelectList'這將是傻瓜的每個'SelectListItem'屬性) – 2014-10-30 04:05:40

+0

這是不正確的,如果用戶刷新頁面GET操作將重新分配TempData ... – theLaw 2014-11-03 07:33:15

+1

不,這是不正確的。最初的GET將值添加到'TempData'。當表單被提交時,這些值將從'TempData'正確加載並返回視圖。如果用戶現在刷新表單,它會轉到POST方法(而不是GET方法),並且由於'TempData'只能存活一個請求,所以該值現在爲空,並且拋出異常。我建議你試試看。 – 2014-11-03 07:56:55