1

以下に示すように、チェックボックスと送信ボタンを含むビューがあります。

@using (Html.BeginForm())
    {
        <fieldset>
            <legend style="font-size: 100%; font-weight: normal">Delete</legend>
            <p> Are you sure you want to delete?</p>
            @foreach (string resource in resources)
            {
                if (resource != "")
                {
                    <input type="checkbox" name="Resources" title="@resource" value="@resource" checked="checked"/>@resource
                    <br />
                }
            }
            <br />

            @Html.HiddenFor(m => m.AttendeeListString)
        @Html.HiddenFor(m => m.ResourceListString)

            <span class="desc-text">
                <input type="submit" value="Yes" id="btnYes" />
            </span>
            <span class="desc-text">
                <input type="submit" value="No" id="btnNo" />
            </span>
        </fieldset>
    }

以下はコントローラーコードです...

public ActionResult DeleteResource(RoomModel roomModel)
{
...
}

RoomModelには他のデータが含まれています...

コントローラのチェックボックス値にアクセスするにはどうすればよいですか?注:送信ボタンをクリックしたときにコントローラーに送信する必要のある情報がたくさんあります...誰かが解決策を提案できますか...

答え :

これらの2つのプロパティをモデルに追加しました

public List<SelectListItem> Resources
{
    get;
    set;
}

public string[] **SelectedResource**
{
    get;
    set;
}

そして、私のビューのチェックボックスは次のように更新されました

@foreach (var item in Model.Resources)
{
<input type="checkbox" name="**SelectedResource**" title="@item.Text" value="@item.Value" checked="checked"/>@item.Text
<br /><br />
}

そしてコントローラーで..。

if (roomModel.SelectedResource != null)
{
    foreach (string room in roomModel.**SelectedResource**)
    {
      resourceList.Add(room);
    }
}

注:モデルのチェックボックスとプロパティの名前は同じである必要があります。私の場合はSelectedResourceです

4

5 に答える 5

1

いくつかのオプションがあります。最も簡単な方法は次のとおりです。

1)パラメーターはビューモデルをResourcesプロパティでバインドします。この方法が推奨されるMVCパラダイムであり、キャプチャする必要のある追加フィールドのプロパティを追加するだけで済みます(また、属性を追加するだけで検証を簡単に利用できます)。

新しいビューモデルを定義します。

public class MyViewModel
{
    public MyViewModel()
    {
       Resources = new List<string>();
    }

    public List<string> Resources { get; set; }

    // add properties for any additional fields you want to display and capture
}

コントローラでアクションを作成します。

public ActionResult Submit(MyViewModel model)
{
      if (ModelState.IsValid)
      {
           // model.Resources will contain selected values
      }
      return View();   
}

resources2)パラメータは、アクションで直接指定された文字列のリストをバインドします。

public ActionResult Submit(List<string> resources)
{
      // resources will contain selected values

      return View();   

}

@Html.CheckBox質問では、ビューがチェックボックスを作成しており、各項目がチェックされているかどうかを示すブール値(ヘルパーを使用した場合に予想される)ではなく、チェックされたすべてのリソースの文字列値を送信することに注意してください。それはまったく問題ありません。私の答えが異なる理由を指摘しているだけです。

于 2013-01-23T12:46:47.133 に答える
0

resources変数はコントローラーで生成されるか、ViewModelに配置できると想定しています。もしそうなら、これは私がそれにアプローチする方法です:

ビューモデルにはResources辞書が追加され、次のようになります。

public class RoomModel
{
    public Dictionary<string,bool> Resources { get; set; }

    // other values...
}

Resourcesキー()としてリソースアイテムの名前をディクショナリに入力しstring、「チェック済み」値(bool)をデフォルトのfalse状態に設定します。

例:([HttpGet]コントローラー内)

// assuming that `resource` is your original string list of resources
string [] resource = GetResources();
model.Resources = new Dictionary<string, bool>();
foreach(string resource in resources)
{
  model.Resources.Add(resource, false);
}   

ビューでレンダリングするには、次のようにします。

@foreach (string key in Model.Resources.Keys)
{
  <li>
    @Html.CheckBoxFor(r => r.Resources[key])
    @Html.LabelFor(r => r.Resources[key], key)
  </li>
}

これにより、[HttpPost]コントローラーは、ポストバック時にモデルに辞書を自動的に入力できるようになります。

public ActionResult DeleteResource(RoomModel roomModel)
{
  // process checkbox values
  foreach(var checkbox in roomModel.Resources)
  {
    // grab values
    string resource = checkbox.Key;
    bool isResourceChecked = checkbox.Value;

    //process values...
    if(isResourceChecked)
    {
      // delete the resource
    }

    // do other things...
  }
}
于 2013-01-24T09:40:06.100 に答える
0

MVCアクションで、チェックボックスの名前に対応するパラメーターを次のように設定します。

bool resources
bool[] resources
于 2013-01-23T12:44:34.450 に答える
0

javascriptまたはjqueryを使用してすべての値を収集し、コントローラーに投稿します

var valuesToSend='';

$('input:checked').each(function(){
valuesToSend+=$(this).val() + "$";//assuming you are passing number or replace with your logic.
});

送信後、ajax関数を呼び出します

$.ajax({
url:'yourController/Action',
data:valuesTosend,
dataType:'json',
success:function(data){//dosomething with returndata}
})

または、モデルをコントローラーに渡すことができます。Model-View-ViewModelパターンを実装した場合。

public class yourViewModel
{
    public string Id { get; set; }
    public bool Checked { get; set; }
}

アクションメソッド

[HttpPost]
    public ActionResult Index(IEnumerable<yourViewModel> items)
    {
         if(ModelState.IsValid)
          {
            //do with items. (model is passed to the action, when you submit)
          }
    } 
于 2013-01-23T12:45:39.927 に答える
0

これらの2つのプロパティをモデルに追加しました

public List<SelectListItem> Resources
{
    get;
    set;
}

public string[] **SelectedResource**
{
    get;
    set;
}

そして、私のビューのチェックボックスは次のように更新されました

@foreach (var item in Model.Resources)
{
<input type="checkbox" name="**SelectedResource**" title="@item.Text" value="@item.Value" checked="checked"/>@item.Text
<br /><br />
}

そしてコントローラーで..。

if (roomModel.SelectedResource != null)
{
    foreach (string room in roomModel.**SelectedResource**)
    {
      resourceList.Add(room);
    }
}

注:モデルのチェックボックスとプロパティの名前は同じである必要があります。私の場合はSelectedResourceです

于 2013-01-25T08:39:23.587 に答える