1

次のビューモデルを用意しましょう:

public class ViewModel
{
     public string SomeValue {get; set;}
     public int CountryId {get; set;}
}

そして国リスト

var countryList = new[]{new[]{Country="Russia", Value=1},new[]{Country="USA", Value=2},new[]{Country="Germany", Value=3} }

これらのフィールドを含むフォームを作成したいと考えています。問題は、国の入力が TEXTBOX でなければならないことです。

だから私はただのようなものを書くことはできませんHtml.TextBoxFor(m => m.CountryId)。そのようなタスクのベスト プラクティスは何ですか? それは隠しフィールドですか、それとも何か他のものですか?


編集

インターフェイスは次のようになります。

    SomeValue: |_______|

    Country:   |_______|

                |Submit button|

フィールド Country には、国名のみを入力できます。SomeValue では、他の値は何でも構いません (SomeValue が存在しないと想像できます)。

4

3 に答える 3

1

ドロップダウン リストの方がはるかに適切と思われる場合、これは確かに奇妙な要件ですが、これまでにも奇妙な要件がありました。:) これを機能させるために知っておくべきことをうまく説明できる簡単な例を次に示します。

まず、国名を ID に関連付ける単純なモデル:

public class CountryModel
{
    public int Id { get; set; }
    public string Country { get; set; }
}

今コントローラー:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(string country)
    {
        var countryId = GetCountries()
                        .Where(c => c.Country.ToLower() == country.ToLower())
                        .Select(c => c.Id)
                        .SingleOrDefault();

        if (countryId != 0)
            return RedirectToAction("Thanks");
        else
            ModelState.AddModelError("CountryNotSelected", "You have selected an invalid country.");

        return View();
    }

    private List<CountryModel> GetCountries()
    {
        return new List<CountryModel>
        {
            new CountryModel { Id = 1, Country = "Russia" },
            new CountryModel { Id = 2, Country = "USA" },
            new CountryModel { Id = 3, Country = "Germany" }
        };
    }
}

ビューは次のとおりです。

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(false)
    <fieldset>
        <div class="editor-field">
            @Html.TextBox("Country")
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

ここで注意すべき点がいくつかあります。まず、このビューに追加のプロパティがあることを既に述べました。その場合、CountryViewModel単純に文字列にバインドするのではなく、モデルを HTTP POST メソッドのインスタンスにバインドします。したがって、次のようなものです。

public class CountryViewModel
{
    public string SomeValue { get; set; }
    public string SomeMoreFormData { get; set; }
    public string Country { get; set; }
}

ここから、POST メソッドは次のように変更されます。

[HttpPost]
public ActionResult Index(CountryViewModel viewModel)
{
    var countryId = GetCountries()
                    .Where(c => c.Country.ToLower() == viewModel.Country.ToLower())
                    .Select(c => c.Id)
                    .SingleOrDefault();

    if (countryId != 0)
        return RedirectToAction("Thanks");
    else
        ModelState.AddModelError("CountryNotSelected", "You have selected an invalid country.");

    return View(viewModel);
}

次に、 を介して国のリストを作成する方法に注目してGetCountries()ください。これにより、後でこれを簡単にリファクタリングして、要件が変更された場合にデータベースから国のリストを取得できます。

于 2012-08-07T10:50:46.380 に答える
0
@using (Html.BeginForm("Index", "Home")) {    
<p>
Page number:
@Html.TextBox("CountryId")

<input type="submit" value="CountryId" />
</p>
}

[HttpPost]
public ActionResult Index(int countryId)
{ 
CountryId= countryId;
}
于 2012-08-07T07:18:59.293 に答える
0

あなたの質問が100%理解できません。ユーザーが国の ID と名前を入力できるというのは正しいですか?

ビューモデルをビューに送信することをお勧めします。次のビュー モデルがあるとします。

public class YourViewModel
{
     public string CountryName {get; set;}
     public string CountryId {get; set;}
}

アクション メソッドは次のようになります。

public ActionResult Index()
{
     YourViewModel viewModel = new YourViewModel();

     return View(viewModel);
}

[HttpPost]
public ActionResult Index(YourViewModel viewModel)
{
     // Check viewModel for nulls
     // Whatever was typed in on the view you have here,
     // so now you can use it as you like
     string country = viewModel.CountryName;
     string id = viewModel.CountryId;

     // Do whatever else needs to be done
}

ビューは次のようになります。

@model YourProject.DomainModel.ViewModels.YourViewModel

@using (Html.BeginForm())
{
     <div>
          @Html.TextBoxFor(x => x.CountryName)<br />
          @Html.ValidationMessageFor(x => x.CountryName)
     </div>

     <div>
          @Html.TextBoxFor(x => x.CountryId)<br />
          @Html.ValidationMessageFor(x => x.CountryId)
     </div>

     <button id="SaveButton" type="submit">Save</button>
}

これが役立つことを願っています。

于 2012-08-07T07:48:23.940 に答える