0

誰かがこのモデルを手助けしてくれることを願っています。MVC 3 Selectlist/DropDownListでモデルが更新されない

public class Provider 
{ 
    public Guid ProviderId { get; set; } 
    public string Name { get; set; } 

    public Guid LocationId { get; set; } 

    public virtual Location Location { get; set; } 
} 

public class Location 
{ 
    public Guid LocationId { get; set; } 
    public string NameOrCode { get; set; } 
    public string Description { get; set; } 
    public string StreetNumber { get; set; } 
    public string StreetAddress1 { get; set; } 
    public string StreetAddress2 { get; set; } 
    public string City { get; set; } 

    public int? StateId { get; set; } 

    public string Zip { get; set; } 
    public string ContactPhone { get; set; } 

    public virtual State State { get; set; } 
} 

public class State 
{ 
    public int StateId { get; set; } 
    public string Name { get; set; } 
    public string Abbreviation { get; set; } 
} 

あなたが見ることができるように、プロバイダは、場所(他の場所で再利用するために別のクラスを)持っている、と場所は、(選択するまでnullである)状態を持っている:私はこのような3つのモデルクラスを持っています。

私のコントローラーは自分の作成方法のために次のようになります。

public class ProviderController : BaseController 
{ 
    private SetupContext db = new SetupContext(); 

    // other CRUD methods ... 

    // 
    // GET: /Provider/Create 

    public ActionResult Create() 
    { 
     Location location = new Location() 
     { 
      LocationId = Guid.NewGuid(), 
      NameOrCode = Resources.BillingLocation, 
      Description = Resources.BillingLocationDescription 
     }; 
     Provider provider = new Provider() 
     { 
      ProviderId = Guid.NewGuid(), 
      LocationId = location.LocationId, 
      Location = location 
     }; 
     ViewBag.StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId); 

     return View(provider); 
    } 

    // 
    // POST: /Provider/Create 

    [HttpPost] 
    public ActionResult Create(Provider provider) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Locations.Add(provider.Location); 
      db.Providers.Add(provider); 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     ViewBag.StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId); 
     return View(provider); 
    } 

    // other CRUD methods ... 
} 

は最後に、私の見解は次のようになります。

<div class="editor-label"> 
    @Html.LabelFor(model => model.Location.StateId, @Resources.Location_State_Display_Name) 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("StateId", @Resources.ChooseFromSelectPrompt) 
    @Html.ValidationMessageFor(model => model.Location.StateId) 
</div> 

私の問題は、ユーザーがDropDownListコントロールで選択した状態が取得することはありませんということです私のモデルでは、Create POSTで設定します。私は私の編集ビューに似たようなコードを持っていて、状態はそのViewに正しく設定されています(つまり、既存のProvider.Locationに関連付けられている状態がDropDownListで選択されていれば編集できます)。ビューの編集ビューでは、ユーザーの選択は、POSTから入ってくるモデル(特にProvider.Location.StateId)には決して登録されません。私は、私は上記を参照として何とかだけではなくSTATEIDのLocation.StateId関係を伝える必要があるが、私は正しい構文を把握することはできません疑う

<div class="editor-label"> 
    <label for="Location_StateId">State/Territory</label> 
</div> 
<div class="editor-field"> 
    <select id="StateId" name="StateId"><option value="">[Choose]</option> 
     <option value="1">Alabama</option> 
     <option value="2">Alaska</option> 
     <!-- more options ... --> 
    </select> 
    <span class="field-validation-valid" data-valmsg-for="Location.StateId" data-valmsg-replace="true"></span> 
</div> 

:HTMLを見て

は、私がこれを見生産しましたそれをする。私はこのようLocation_StateIdために私ViewBag動的プロパティを変更しようとしました:このような私の見解では

ViewBag.Location_StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId); 

とのDropDownList:

@Html.DropDownList("Location_StateId", @Resources.ChooseFromSelectPrompt) 

私はおそらくその表記が私の横にラベルために働くだろう、その後考え出しDropDownListは次のように表示されました:

<div class="editor-label"> 
    <label for="Location_StateId">State/Territory</label> 
</div> 

この試行は失敗しました。あなたは私を助けることができます?

ありがとうございます。

答えて

1
@Html.DropDownList("Location.StateId", @Resources.ChooseFromSelectPrompt) 

また、次の行には何も有効ではありません。

ViewBag.StateId = new SelectList(db.States, "StateId", "Name", provider.Location.StateId); 

あなたはスカラプロパティであると考えられるものにSelectListのを割り当てています。ビュー内の

ViewBag.States = new SelectList(db.States, "StateId", "Name", provider.Location.StateId); 

、その後:あなたはおそらくViewBagとしてコレクションを渡したい

@Html.DropDownList("Location.StateId", (SelectList)ViewBag.States) 
+0

はどうもありがとうございました!私は今、APIのそれぞれの部分をはるかに良く理解しており、状態が選択されている可能性があります。 – jlavallet

関連する問題