2011-02-04 11 views
4

3つの部分ビューが別々のモデルで厳密に型指定されています。各ビューには独自のフォームが含まれ、異なるアクションに送信されます。いくつかのモデルには同じ名前のプロパティが含まれています.HTMLヘルパーメソッドを使用してテキストボックスとラベルを作成すると、ページ上に重複するHTML IDが表示されます。ASP.NET MVCで複数のパーシャルを使用するときに入力IDが重複する

一部_Residentialビュー

@model MyProject.Models.ResidentialModel 

@using (Html.BeginForm("Residential", "Transaction")) 
{ 
    @Html.LabelFor(m => m.PersonName) 
    @Html.TextBoxFor(m => m.PersonName) 

    @Html.LabelFor(m => m.ReferenceNumber) 
    @Html.LabelForm(m => m.ReferenceNumber) 

    <input type="submit" value="Submit" /> 
} 

一部_Businessビュー

@model MyProject.Models.BusinessModel 

@using (Html.BeginForm("Business", "Transaction")) 
{ 
    @Html.LabelFor(m => m.BusinessName) 
    @Html.TextBoxFor(m => m.BusinessName) 

    @Html.LabelFor(m => m.ReferenceNumber) 
    @Html.LabelForm(m => m.ReferenceNumber) 

    <input type="submit" value="Submit" /> 
} 

ノーマルビュー

<h2>Residential Transaction</h2> 
@Html.Partial("_Residential") 

<h2>Business Transaction</h2> 
@Html.Partial("_Business") 

私は、次のようなルックスを取得しています出力:

<h2>Residential Transaction</h2> 
<form action="/Transaction/Residential" method="post"> 
    <label for="PersonName">Person Name:</label> 
    <input type="text id="PersonName" name="PersonName" /> 

    <label for="ReferenceNumber">Reference Number:</label> 
    <input type="text" id="ReferenceNumber" name="ReferenceNumber" /> 

    <input type="submit" value="Submit" /> 
</form> 

<h2>Business Transaction</h2> 
<form action="/Transaction/Business" method="post"> 
    <label for="BusinessName">Business Name:</label> 
    <input type="text" id="BusinessName" name="BusinessName" /> 

    <label for="ReferenceNumber">Reference Number:</label> 
    <input type="text" id="ReferenceNumber" name="ReferenceNumber" /> 

    <input type="submit" value="Submit" /> 
</form> 

ReferenceNumberは、両方のモデルであるので、私はページ上の重複したIDを取得しています。私はTextBoxForにidを変更するために余分なhtmlAttributesパラメータを渡すことができるとわかりました。

@Html.TextBoxFor(m => m.ReferenceNumber, new { id = "ResidentialReferenceNumber" }) 
... 
@Html.TextBoxFor(m => m.ReferenceNumber, new { id = "BusinessReferenceNumber" }) 

これは入力のIDを修正しますが、ラベルの 'for'属性の値はまだ間違っています。 LabelFor()のさまざまなオーバーロードを調べ、TextBoxForとは異なり、htmlAttributesプロパティはありません。これらのフィールドに異なるIDを使用するようモデルやビューに伝えることができる方法はありますか?

+0

うーんを使用している場合、それがどのように動作するかがわからないよ...ので、あなたは答えを見つけたようですね。質問はなんですか? – Cynthia

+0

何が起こったのか分かりませんが、私の最後の段落は途切れました。投稿を更新して追加しました。 – Will

+0

興味深いのは、idを定義することで、同じモデルのリストに対して複数のテキストボックスがあるような、私の同様の問題が実際に解決されたからです。問題は、テキストボックスが同じプロパティであってもモデルの異なるインスタンスであったため、テキストボックスの1つを編集すると同じIDを持つ他のテキストボックスを編集するということでした。とてもありがとう! –

答えて

4

MVCヘルパーは、ビュー内で複数のモデルを使用できることを考慮していません。同じ名前のすべてのプロパティは重複する値を取得します(モデルごとに1つの値)。

つまり、ResidentalTransactionとBusinessModelのプロパティがNameの場合、htmlフォームには2つの<input type="text" name="Name" />フィールドがあります。

私はあなたが同じのviewmodelにすべてのモデルを追加し、Html.TextBoxFor(m => m.ResidentalTransaction.Id);

+0

これは、新しいラッパーモデルクラスの元のモデルと元のモデルのプロパティ名に与えられたプロパティ名を使用しているため、この問題を修正しているようです。 – Will

関連する問題