0

mvc ビューにテキスト ボックスがあります。テキスト ボックス データを beginform ルート値に渡したいのですが、どうすればよいですか?

意見:

@using (Html.BeginForm("Index", "InwardDetail", FormMethod.Post))
{
    <fieldset style="width:80%;margin-left:auto;margin-right:auto;margin-top:20px;min-width:60%">
         <div>
            <table class="tableView" style="width:100%">
                <tr>
                    <td>
                        @Html.DevExpress().Label(lbl=>{
                       lbl.Name = "lblFromDate";
                       lbl.Text = "From Date";
                   }).GetHtml()
                    </td>
                    <td>
                        @Html.TextBox("txtFromDate", value: DateTime.Now.ToString("dd/MM/yyyy"), htmlAttributes: new {id="fromDate", Class="textbox",style="width:70px"})
                    </td>

                    <td>
                        @Html.DevExpress().Button(but=>{
                       but.Name = "butView";
                       but.Text = "View";

                       but.UseSubmitBehavior = true;
                                       }).GetHtml()
                    </td>
                </tr>
                <tr>
                    <td colspan="9">
                        @Html.Partial("InwardDetailPartial")
                    </td>
                </tr>
            </table>
        </div>
    </fieldset>
}

コントローラ:

public ActionResult Index(string fDate)
        {
            _unitOfWork = new UnitOfWork();
            blInwarddetail = new InwardRegisterBL(_unitOfWork);
            var result = blInwarddetail.GetInwardList(fDate);
            return View("Index", result);
        }

ボタンをクリックすると、値がコントローラーに渡されます。

4

1 に答える 1

0

の使用は@Html.TextBox("txtFromDate", ..)、 で入力を生成することを意味しますname="textFromDate"。フォームを送信すると、フォーム コントロールの名前と値のペアが送信されます。この場合はtxtFromDate: 27/06/2015.

ただし、投稿先のメソッドには、という名前のパラメーターがありませんtxtFromDate( という名前のパラメーターは 1 つだけfDateです)。メソッドを次のように変更する必要があります

[HttpPost]
public ActionResult Index(string txtFromDate)
{
  ....
}

ただし、コードには対処すべき問題が多数あります

まず、ビューで表示/編集したいものを表すビューモデルを作成する必要があります

public class FilterViewModel
{
  [Display(Name = "...")] // some user friendly display name
  [Required(ErrorMesage = "Please enter a valid date")]
  public DateTime Date { get; set; }
}

表示したコードから、文字列ではなく日付を入力しているように見えるため、プロパティはDateTime(not string) である必要があります。これにより、プロパティのクライアントとサーバーの検証も確実に取得できます。また、プロパティにわかりやすい名前を付けますfDate(それが何を意味するのか推測できません - おそらく FinishDate でしょうか?)

GET メソッドで

public ActionResult Index()
{ 
  FilterViewModel model = new FilterViewModel();
  model.Date = DateTime.Today;
  return View(model);
}

そしてビューでは

@model yourAssembly.FilterViewModel
@using (Html.BeginForm())
{
  ....
  @Html.LabelFor(m => m.Date)
  @Html.TextBoxFor(m => m.Date, "{0:dd/MM/yyyy}", new { @class = "textbox" })
  @Html.ValidationMessageFor(m => m.Date)
  ....
}

モデル プロパティに強くバインドしていることに注意してください。2 番目のパラメーターは、フォーマット文字列を指定します。idプロパティ (これは になりますid="Date") をオーバーライドし、クラス名 use を追加する必要はないよう@class = ".."です。また、クラス名を追加しているためstyle="width:70px"、css を削除して代わりに使用する必要があります。テーブル要素も削除する必要があります。HTML テーブル要素は、レイアウトではなく、表形式のデータに使用されます。

そして最後に投稿方法は

[HttpPost]
public ActionResult Index(FilterViewModel model)
{
  if (!ModelState.IsValid)
  {
    return View(model);
  }
  // model.Date will contain the value enter by the user
}

最後に、これが本当に POST であるべきかどうか疑問に思います。コードから、データを変更していないように見えますが、おそらくこれはそうあるべきFormMethod.GETですか? または、フィルターに基づいて ajax を使用して現在のページを更新します。

于 2015-06-27T10:31:29.543 に答える