2009-05-30 1 views
2

ユーザー名(テキストボックス)、電子メール(テキストボックス)、および除算(選択リスト)を表示する登録フォームがあります。名前と電子メールはあらかじめ設定されています(私はWindows認証、イントラネットアプリケーションを使用しています)。そして、DropDownからSelectedValueをInt32として私のコントローラに送りたいので、SelectList全体を戻したくありません。このリストは今は小さいですが、かなりの大きさに成長します。SelectList "SelectedValue"をコントローラアクションメソッドに渡す

私はRegistrationViewModelというクラスには、これらのフィールドのパブリックプロパティが含まれています。しかし、私がDivisionListにSelectListを使用すると、私はこのエラーを受け取ります:No parameterless constructor defined for this object.

Typeを変更しても問題はありませんが、Divisionはnullまたは0です。DropDownのSelectedValueをController ActionメソッドにInt32として渡す方法はありますか?

編集1:私は私がやっている、本当にわからないんだけど

、私は約48時間のMVCを使用してきた、PDF、開催されたTechEd、およびTechDaysのビデオを見ました。

私の謝罪は、ここに私のコントローラのコードである:ここではビューだ

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(RegistrationViewModel rvm) 
{ 
    IApplicationContext context = ContextRegistry.GetContext(); 
    IValidationErrors errors = new ValidationErrors(); 

    IValidator validator = (IValidator)context.GetObject("RegistrationValidator"); 
    bool valid = validator.Validate(rvm, errors); 

    if (valid) 
     repo.SaveRegistration(); 
    else 
     ViewData["DivisionList"] = repo.GetDivisions(); 

    return View(rvm); 
} 

RegistrationViewModelクラス

public class RegistrationViewModel 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    //public SelectList DivisionList { get; private set; } 
    public int Division { get; set; }  
} 

<%@ Page Language="C#" 
MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<RegistrationViewModel>" %> 

<%@ Import Namespace="Project1.Entities"%> 
<%@ Import Namespace="Project1.Models"%> 

<asp:Content ID="registerTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
    Register 
</asp:Content> 

<asp:Content ID="registerContent" ContentPlaceHolderID="MainContent" runat="server"> 
... 
    <% using (Html.BeginForm()) 
     { %> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 
       <p> 
        <label for="name">Name:</label> 
        <%= Html.TextBox("Name", User.Identity.Name.GetDisplayName()) %> 
        <%= Html.ValidationMessage("username") %> 
       </p> 
       <p> 
        <label for="email">Email:</label> 
        <%= Html.TextBox("email", User.Identity.Name.GetEmailFromLogin()) %> 
        <%= Html.ValidationMessage("email") %> 
       </p>    
       <p> 
        <label for="division">Division:</label> 
        <%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%> 
        <%= Html.ValidationMessage("confirmPassword") %> 
       </p> 
       <p>     
        <input type="submit" value="Register" /> 
       </p> 
      </fieldset> 
     </div> 
    <% } %> 
</asp:Content> 

編集2:

エイロン:ここで私は私もそれを変更するものだ:

コントローラー:

public ActionResult Register() 
{ 
    ViewData["DivisionList"] = repo.GetDivisions(); 
    return View(); 
} 

ビュー:

<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%> 

私はこの例外を受け取る: なしのViewData項目はキータイプの 'DivisionValue'「IEnumerableをしてありません'

私はこれを見る更新時:

<%= Html.DropDownList("DivisionList", ViewData["DivisionList"] as SelectList)%> 

をそれだけで素晴らしい作品!これは、「Division」のすべてのアイテムが同じ名前であれば機能するようです。名前を変更すると、Viewがクラッシュするか、ViewModelの "Division"プロパティが0として送信されます。

なぜですか? 、

public string DivisionValue { get; set; } 

またはINTするタイプを変更したDateTime、または任意の適切なタイプがある:

+0

コントローラのアクションコードをお知らせください。どのように電子メールテキストボックスの価値を渡していますか? – ichiban

答えて

5

RegistrationViewModelタイプは、次のようなシンプルな型指定されたプロパティが含まれている必要があります。

HTMLとHTTPでは、ドロップダウンリストにポストバックされるのは、フィールドの名前と選択された値だけです。

また、ドロップダウンリストに異なる入力された名前をレンダリングするビューを変更する必要があるすべてはあなたを一致させるために取得するには:私は「DivisionValue」を使用してい

<%= Html.DropDownList("DivisionValue", ViewData["DivisionList"] as SelectList)%> 

お知らせですリストのディビジョンリストが利用可能なすべてのアイテムのリストとして表示されます。

0

私はちょうどSelectListタイプでもっと明白になります。私はコントローラーアクションでSelectListを作成し、ビューでキャストすることを忘れてしまいます。私のコードは、この(CRUD Editページ)のように動作します:アクション..in

  ViewData["WorkType.ID"] = new SelectList(this._vacancySvc.GetVacancyWorkTypes(), 
      "ID", "Name", ViewData["WorkType.ID"] ?? vacancy.WorkType.ID); 

..andビューで:

<p><% =Html.Encode("Work Type:") %><br /> 
      <% =Html.DropDownList("Worktype.ID")%><span class="smallgrey">(required)</span><br /> 

..あなたはそれを見ることができるのいずれか最初の選択(DBから)は保持されるか、[ヌル合体オペレータ] [1](??)を使用して(フォームが検証に失敗した場合のように)ポストバックのViewDataが保持されます。

また、私はこのコードをリファクタリングすると、あなたのようにViewModelオブジェクトを使用したいと思うでしょう。 唯一のことは、(1)ビューのViewModel SelectListプロパティを参照する必要はありません。coz MVCはHtml.DropDownList()オーバーロードでこれを自動バインドします。(2)私はまだViewDataを参照する必要がありますとにかくアクションが失敗した検証ポストから選択された値を取得するように戻って、本当にポイントは何ですか?