2011-06-13 81 views
1

我創建了一個類來保存一些靜態數據:通過視圖模型傳遞參考/靜態數據的視圖,MVC3

static public class ReferenceData 
    { 
     [DisplayName("Status")] 
     public IEnumerable<SelectListItem> StatusType 
     { 
      get 
      { 
       return new[] 
        { 
         new SelectListItem { Value = "0", Text = "Release" }, 
         new SelectListItem { Value = "1", Text = "Beta" }, 
         new SelectListItem { Value = "2", Text = "Alpha" }, 
        }; 
      } 
     } 
    } 

現在我想使用該類數據來填充一個下拉列表中視圖。我有以下視圖模型:

public class adminViewModel 
{ 
    public HouseData HouseData { get; set; } 
    public string Status { get; set; } 
    public ReferenceData ReferenceData { get; } // <<<<<< My problem here 
} 


@Html.DropDownListFor(
    x => x.Status, 
    new SelectList(Model.ReferenceData.StatusType, "Value", "Text"), 
    new { style = "display: inline;" } 
) 

,我的問題是,我不知道這是因爲我使用一個靜態類,並做一個有效的方式,當我有搞定;還有裏面的{}它在抱怨一個錯誤消息編譯說:

static types cannot be used as return types 

我真的需要,使之成爲非靜態和實例化類之前,我可以在視圖模型,即使數據使用總是靜態的?

回答

0

這不是有效的C#。終於在視圖

public class AdminViewModel 
{ 
    public string Status { get; set; } 

    [DisplayName("Status")] 
    public IEnumerable<SelectListItem> Statuses 
    { 
     get 
     { 
      return ReferenceData.GetStatusType(); 
     } 
    } 
} 

:你可以使用,而不是一個靜態方法:

public static class ReferenceData 
{ 
    public static IEnumerable<SelectListItem> GetStatusType() 
    { 
     return new[] 
     { 
      new SelectListItem { Value = "0", Text = "Release" }, 
      new SelectListItem { Value = "1", Text = "Beta" }, 
      new SelectListItem { Value = "2", Text = "Alpha" }, 
     }; 
    } 
} 

然後

@Html.DropDownListFor(
    x => x.Status, 
    new SelectList(Model.Statuses, "Value", "Text"), 
    new { style = "display: inline;" } 
) 
+0

,不同之處在於數據類型應該位於viewbag,viewdata或tempdata中。除了viewmodel之外的任何地方。該數據與模型無關。 – 2011-06-13 08:41:43

+1

@nathan gonzalez,ViewBag和ViewData是ASP.NET MVC中最邪惡的東西,對於我來說這種數據絕對不應該存在。 TempData,我不知道=>有一些罕見的情況下,這可能是有用的。我認爲你的意思是這個數據可以在控制器動作查詢的存儲庫方法中進行硬編碼,以填充模型。那麼我會同意你的看法。 – 2011-06-13 08:45:31

+0

存儲庫中的硬編碼?我不認爲我會這樣做。你爲什麼討厭viewbag和viewdata。這種類型的數據是他們設計的。視圖模型是針對視圖模型的,這些數據顯然不是其中的一部分。 – 2011-06-13 08:49:16

0

您確定要讓您的課程成爲靜態而不是該屬性嗎?如果您有一個靜態屬性,則不必爲了訪問屬性而創建一個實例。更多信息:Static Classes and Static Class Members (C# Programming Guide)

+0

我想讓類是靜態的,所以我不必實例化它。這是一個正確的說法嗎?我從類中刪除靜態並將靜態添加到狀態類型。然後在視圖模型中,我得到一個不同的消息:..... ReferenceData.get'必須聲明一個實體,因爲它沒有標記爲抽象或外部。自動實現的屬性必須同時定義get和set訪問器。 – 2011-06-13 08:28:46

+0

使屬性靜態而不是類 – Eranga 2011-06-13 08:30:02

+0

@DavidH如果你想要ReferenceData是一個只讀自動實現的屬性,那麼你應該寫公共ReferenceData ReferenceData {get;私人設置; } – Vedran 2011-06-13 08:39:35

0

你想這樣做:

public class ReferenceData 
    { 
     private static readonly SelectListItem[] Items = new[] 
       { 
        new SelectListItem { Value = "0", Text = "Release" }, 
        new SelectListItem { Value = "1", Text = "Beta" }, 
        new SelectListItem { Value = "2", Text = "Alpha" }, 
       }; 

     [DisplayName("Status")] 
     public IEnumerable<SelectListItem> StatusType 
     { 
      get { return Items; } 
     } 
    } 

(使項目靜態的,而使用類的實例)。

你也可以使用一個單:

public class ReferenceData 
    { 
     private static readonly ReferenceData _instance = new ReferenceData(); 

     private ReferenceData() 
     { 

     } 

     public ReferenceData Instance { get { return _instance; } } 

     [DisplayName("Status")] 
     public IEnumerable<SelectListItem> StatusType 
     { 
      get 
      { 
       return new[] 
       { 
        new SelectListItem { Value = "0", Text = "Release" }, 
        new SelectListItem { Value = "1", Text = "Beta" }, 
        new SelectListItem { Value = "2", Text = "Alpha" }, 
       }; 
      } 
     } 
    } 

而且在模型中使用它:

public class adminViewModel 
{ 
    public HouseData HouseData { get; set; } 
    public string Status { get; set; } 
    public ReferenceData ReferenceData { get {return ReferenceData.Instance; } } 
} 
+0

我現在就試試這個。謝謝 – 2011-06-13 08:39:55

+0

您的回答非常好。只是一個問題。我如何在C#程序中訪問StatusType。我試圖做var data1 = new ReferenceData();但它出現錯誤消息由於其保護級別,參考數據無法訪問。 – 2011-06-13 08:51:12

+0

'var data = ReferenceData.Instance.StatusType' – jgauffin 2011-06-13 08:55:18

0

首先是創建模型這樣的..

public class ReferenceData 
{ 
    public string SelectRuleId { get; set; } 

    public IEnumerable<SelectListItem> StatusType 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "0", Text = "Release" }, 
       new SelectListItem { Value = "1", Text = "Beta" }, 
       new SelectListItem { Value = "2", Text = "Alpha" }, 
      }; 
     } 
    } 
} 

然後創建像這樣的任何控制器新的動作..

public ActionResult About() 
    { 
     var model = new ReferenceData(); 

     ViewBag.Message = "DropDown Selected For "; 

     return View(model); 
    } 

然後在你的動作視圖使用此HTML ...

@model MVCDropDownList.Models.AnswersViewModel 

@using (Html.BeginForm()) 
    { @Html.DropDownListFor(x => x.SelectRuleId , new SelectList(Model.StatusType, "Value", "Text"), new { id = "DId" }) 
    } 
相關問題