0

コンピューター上のフォルダーから使用されるドロップダウン メニューで、ユーザーが異なる名前を選択できるようにしようとしています。何かを選択したら、ボタンを押してファイルを編集できるようにする必要があります。だけを使用しないようにしてViewBagいます。

FormCollection私のコントローラー(正しいデータをに返しているのはどれFormCollectionですか?)

public ActionResult Index()
{
    FormCollection tableNames = TableNames();
    return View("Index",tableNames);
}

public FormCollection TableNames()
{
    String[] tableNamesPath = Directory.GetFiles(@"C:\Something\");
    FormCollection form = new FormCollection();

    foreach(String tableName in tableNamesPath)
    {
        form.Add(Path.GetFileName(tableName), Path.GetFileName(tableName));
    }

    return form;
}

基本的に、私は自分の見解には何も持っていません.andを使用しようとしましたHtml.DropDownListHtml.DropDownListFor(違いは何ですか?)、何も機能していないようです. それは私が見逃しているばかげたものかもしれませんが、何か助けていただければ幸いです。

4

3 に答える 3

2

ビューモデルを使用することをお勧めします。したがって、定義することから始めます。

public class TableViewModel
{
    public string SelectedItem { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

次に、コントローラーにこのビューモデルをビューに渡します。

public ActionResult Index()
{
    var tableNames = TableNames();
    return View("Index", tableNames);
}

public TableViewModel TableNames()
{
    String[] tableNamesPath = Directory.GetFiles(@"C:\Something\");
    TableViewModel model = new TableViewModel();
    model.Items = tableNamesPath.Select(item => new SelectListItem
    {
        Value = Path.GetFileName(item),
        Text = Path.GetFileName(item),
    }).ToList();

    return model;
}

次に、ビューをこのビュー モデルに強く型付けすると、強く型付けされた DropDownListFor ヘルパーを使用できるようになります。

@model TableViewModel 

@Html.DropDownListFor(x => x.SelectedItem, Model.Items)
于 2013-10-24T14:36:37.917 に答える
1

まず、FormCollectionを渡すことは基本的に間違っています。はFormCollection、フォームのすべての後続値を反復処理するために使用されます。

MVC の基本的な考え方に対するあなたの理解は間違っていると思います。あなたが達成しようとしているのは、ファイルの編集です。したがって、モデルは というクラスにする必要がありますFileModel。コントローラーは次のようになります。

[HttpGet]
public ActionResult Index()
{
    return View("Index", new FileModel());
}

これにより、 の新しいインスタンスにバインドされたビューが提供されますFileModel。次のステップでは、編集するファイルのファイル名を選択します。これは、次のステップで割り当てられるFileModelというプロパティを取得することを意味します。FileName

public class FileModel
{
    [Required]
    public string FileName { get; set; }
}

これでモデルコントローラーができました。欠けているのはビュー部分です。これは、実際にユーザー インタラクションを担当する部分です。ファイルを選択する方法はコントローラーの責任ではないため、ドロップダウンの作成はビューから行う必要があります。私の意見では、コントローラーは、ファイル名の選択にドロップダウンが使用されていることさえ認識すべきではありません。

@model FileModel

@using (Html.BeginForm())
{
    <fieldset>
        <ol>
            <li>
                @Html.LabelFor(m => m.FileName)
                @Html.DropDownListFor(m => m.FileName)
                @Html.ValidationMessageFor(m => m.FileName)
            </li>
        </ol>
        <input type="submit" value="Edit file" />
    </fieldset>
}

DropDownListForのエディター テンプレートがFileName単純なテキスト ボックスではなく、ドロップダウンであることをビューに伝えるだけです。最後のステップは、ドロップダウンのオプションを入力することです。したがって、 のオーバーロードを使用できますDropDownListFor

@Html.DropDownListFor(m => m.FileName, 
    new SelectList(Directory.GetFiles(@"C:\Something\"))

これで、ディレクトリからファイルを選択できるはずです。この選択は、post メソッドからコントローラーで読み取ることができます。

[HttpPost]
public ActionResult Index(FileModel model)
{
    var selectedFileName = model.FileName;
}
于 2013-10-24T14:44:35.960 に答える
1

あなたが正しく理解している場合は、ドロップダウンリストにファイル名のリストを表示したいと考えています。ユーザーがいずれかを選択してボタンをクリックすると、そのファイルの内容がユーザーに表示され、編集および保存できるようになります。

それが正しければ、いくつかのことを行う必要があります-

  1. ファイルの名前を含む SelectList をビューに渡し、ドロップダウンリストに入力します。
  2. 選択した項目と、編集ビューを返す別の編集 (GET) アクション メソッドを送り返します。
  3. 編集したデータを Edit (POST) アクション メソッドにポストバックし、変更を保存します。

これが正しければ、いくつかのコードを投稿します。

于 2013-10-24T14:36:47.627 に答える