3

国の配列からドロップダウンリストを読み込もうとしています:

Country[] Countries = ViewBag.mps.GetCountryList(ViewBag.LogonTicket, ViewBag.PID);
/* Country object defined as, returned from WCF webservice call above:
  <xs:complexType name="Country">
  <xs:sequence>
  <xs:element minOccurs="0" name="CountryName" nillable="true" type="xs:string" /> 
  <xs:element minOccurs="0" name="CountryCode" nillable="true" type="xs:string" /> 
  </xs:sequence>
  </xs:complexType>
*/


<select id="BusinessCountry" name="BusinessCountry" class="validate[required]" parentTab="tab4" style="width:160px;">
@{
    foreach(Country c in Countries) {
    <option value="@c.CountryCode" (@ViewBag.BusinessCountry == @c.CountryCode?"selected=\"selected\"":"") >@c.CountryName</option> 
    }
}
</select>

これは出力です:

<option af?"selected="\&quot;selected\&quot;&quot;:&quot;&quot;)" (us="=" value="AF">Afghanistan</option>

私は何を間違っていますか?どうすれば修正できますか? 私もこれを試しましたが、例外が発生します:

@Html.DropDownList("BusinessCountry", new SelectList(Countries, "CountryCode", "CountryName", @ViewBag.part.BusinessCountry), Countries)

私が持っているコードでそれを行う方法をすでに理解しています:

<select id="BusinessCountry" name="BusinessCountry" class="validate[required]" parentTab="tab4" style="width: 160px;">
@foreach(Country c in Countries) {
  string sel = (ViewBag.part.BusinessCountry == c.CountryCode?"selected=\"selected\"":"");
  <option value="@c.CountryCode" @sel >@c.CountryName</option> 
}
</select>
4

3 に答える 3

6

ビューに多くのコードを混在させることは、これを行うには間違った方法です。また、アクション メソッドとビューの間でこのようなデータを転送するためにViewBag/ViewDataを使用すると、コードが見苦しくなります。アクション メソッドからビューにデータを転送するには、ViewModel を検討する必要があります。

あなたのビューが会社の詳細を作成することであると仮定すると、このようなビューモデルを持っています

public class CompanyViewModel
{
  public string Name { set;get;}
  public IEnumerable<SelectListItem> Countries { set;get;}
  public int SelectedCountry { set;get;}

  CompanyViewModel()
  {
    Countries=new List<SelectListItem>();
  }
}

GETAction メソッドで、viewModel オブジェクトのコレクションにデータを入力し、それCountriesをビューに送信します。

public ActionResult Create()
{
   CompanyViewModel vm=new CompanyViewModel();
   // The below line is hard coded for demo. you may replace 
   //  this with loading data from your Data access layer/ Existing array
   vm.Countries= new[]
   {
      new SelectListItem { Value = "1", Text = "United States" },
      new SelectListItem { Value = "2", Text = "Canada" },
      new SelectListItem { Value = "3", Text = "Australia" }
   };
   return View(vm);
}

強く型付けされたビューで、

@model CompanyViewModel
@using(Html.Beginform())
{
   @Html.DropDownListFor(x => x.SelectedCountry,
                   new SelectList(Model.Countries,"Value","Text"), "Select..")
   <input type="submit" />

}

メソッドで、投稿されたモデルHTTPPostのプロパティ値にアクセスして、選択した国のIDを取得しますSelectecCountry

[HttpPost]
public ActionResult Create(CompanyViewModel model)
{
  if(ModelState.IsValid)
  {
      //check for model.SelectedCountry property value here
      //Save and Redirect
  }
  //Reload countries here
  return View(model);
}
于 2012-09-12T19:09:08.680 に答える
0

次のようなドロップダウン リストを使用します。

コントローラーで:

ViewBag.CompanyId = New SelectList(db.Companies, "CompanyId", "Name", blog.CompanyId)

ビューで:

<div class="editor-field">
    @Html.DropDownList("CompanyId", String.Empty)
    @Html.ValidationMessageFor(Function(model) model.CompanyId)
</div>

注: これは VB です。

于 2012-09-12T18:45:59.597 に答える
0

属性に対してこのコードを試してください

@((ViewBag.BusinessCountry == @c.CountryCode) ? "selected='selected'" : "")
于 2012-09-12T18:49:41.107 に答える