0

私は次のクラスを持っています

public class Lookup
{
    public int Id { get; set; }
    public string Description { get; set; }
    ...
}

public class AccountTypeLookUp: Lookup
{       
    ... 
}

[Serializable]
public class Account
{
    [HiddenInput]
    public int AccountId { get; set; }
    [Required, Display(Name="Account Name", Order=1)]
    public string AccountName { get; set; }
    [Display(Name="Account Description", Order=2)]
    public string AccountDescription { get; set; }
    [Required, Display(Name="Institution Name")]
    public string InstitutionName { get; set; }
    [Required, Display(Name="Account Number"), RegularExpression(@"[0-9]+",ErrorMessage="{0} can only be digits")]
    public string AccountNumber { get; set; }
    [Display(Name = "Routing Number"), RegularExpression(@"[0-9]+", ErrorMessage = "{0} can only be digits")]
    public string RoutingNumber { get; set; }
    [Required, Display(Name = "Account Type")]
    public AccountTypeLookup AccountType { get; set; }
    [ScaffoldColumn(false)]
    public List<Transaction> TransactionCollection { get; set;}

    public Account()
    {
        AccountId = default(int);
        TransactionCollection = new List<Transaction>();
    }

今私の見解では、Id に等しい値を持つアカウント タイプの説明を表示するコンボ ボックスがあります。

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType">
<option value="1">Savings</option>
<option selected="selected" value="2">Checking</option>
<option value="3">CreditCard</option>
</select>

そのコンボボックスをローカル変数にバインドするにはどうすればよいですか

account.AccountType.Id =?

私のメソッドシグネチャは

[HttpPost]
    public ActionResult Create(Account account)

現在、「値 '2' は無効です」というエラーが表示されます。複雑な型を探しているので、これは理にかなっています。

4

2 に答える 2

2

2 つのオプションがあります。最初のオプションは、html ヘルパーを使用せずに、現在行っている方法で行うことです。

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType">
<option value="1">Savings</option>
<option selected="selected" value="2">Checking</option>
<option value="3">CreditCard</option>
</select>

idただし、と を次のように変更する必要がnameあります。ただし、AccountType には説明がないことに注意してください。コンボボックスから単一のプロパティにのみバインドできるため、それはIdプロパティにバインドすることになります。

id="AccountType_Id" name="AccountType.Id"

2 番目のオプションは、バインディングDropDownListForが適切に機能することが保証されるように使用することです。ただし、コントローラーまたはビューのいずれかで selectlistitem を作成する必要があります。ベスト プラクティスでは、コントローラーで作成してビューに渡すことをお勧めします。したがって、次のようなものを使用できます。

@Html.DropDownListFor(m => m.AccountType.Id, Model.AccountTypes)

Accountただし、モデルは、クラスにマップし直すことができるビューモデルです。ビューモデルを使用せず、ビューで直接使用する場合は、ViewBag にAccountリスト ( ) を作成する必要があります。Model.AccountTypes次に、次を変更する必要がありますDropDownListFor

@Html.DropDownListFor(m => m.AccountType.Id, 
    (IEnumerable<SelectListItem>)ViewBag.AccountTypes)

// you might be pulling these values from a database, 
// this is just an example of how you will build the list in the controller,
// you might build this in a for-loop, foreach or linq
ViewBag.AccountTypes = new List<SelectListItem> { 
            new SelectListItem { Value = "1", Text="Savings"},
            new SelectListItem { Value = "2", Text="Checking"},
            new SelectListItem { Value = "3", Text="CreditCard"},
        };
于 2013-04-30T01:51:50.093 に答える
1

Controller/Create?accountType.id=3MVCモデルバインディングは、クエリ文字列をバインドすることを知っていると思いますaccount.AccountType.Id = 3

だから変えてみて

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType" name="AccountType">

<select class="input-validation-error" data-val="true" data-val-required="The Account Type field is required." id="AccountType_Id" name="AccountType.Id">

ここの再帰モデル バインディングのセクションを参照してください: http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

于 2013-04-30T01:44:29.010 に答える