2010-12-27 16 views
0

私は、部分ビューに基づいて動的フォームを構築しています。私のビューは単一のプロパティーを持つモデルを継承します:CatalogName { get; set; }@ Html.Labelは文字列連結を許可しません

私が試してみましたこの:

@Html.Label(Model.CatalogName + "-ProductNumber", "Product Number") 
@Html.TextBox(Model.CatalogName + "-ProductNumber") 

HTMLとはいえ、このようにレンダリング:

<label for>Product Number</label> 
<input name="CatatalogName-ProductNumber" type="text" /> 

私はこのような私のコード記述する場合:

@Html.Label("ProductNumber-" + Model.CatalogName", "Product Number") 

は、それが道をレンダリングしますが私は期待している

<label for="ProductNumber-CatalogName">Product Number</label> 

これはMVCのバグですか?私の連結が私がそれをラベルの中で望んでいるようにうまくいかない理由について何か答えがありますか?TextBoxでうまくいきますか?

私のモデルは次のようになります。

public class Product 
{ 
    public string CatalogName { get; set; } 
} 

私の部分図は、モデルを継承します。

return PartialView("_webForm", Models.Product { CatalogName = "CatalogName"}); 
+0

それが表示され、あなたのコードに基づいて、 '@htmlこと:ここで

は、@ Html.Labelのすべてのメソッドを呼び出すコードです。TextBox() 'は' id'属性を出力しません。これは 'for'が使うものです。これは、MVC(RC2私は思う)の最新バージョンの問題ではないようです - どのバージョンを使用していますか? – Buildstarted

+0

素晴らしいアイコンbtw、私の好きなゲームシリーズの1つ:) – Buildstarted

+0

私はMVC 3 RC2を使用しています。私は自分のIDが出力されていないことに気がつかなかったが、あなたは正しい。文字列 "ProductNumber"を指定すると、idとnameの両方が存在します。 ラベルやテキストボックスを動的な値で追加し、正しく挿入できるようにしましたか? – MrGrigg

答えて

1

私は同様の問題を探している間、このスレッドに遭遇することが起こりました。 Microsoftが(驚くほど)提供しているソースコードを見つけ、少なくとも私の問題を発見しました。

パラメータのコメントが明確でないため、このメソッドを誤って使用していました。私はちょうどテキストを表示する簡単な方法を探していました。最初のパラメータは、ラベルが作成される対応するコントロールのIDである必要があります。 SECONDパラメーターは、ラベルの表示セクションに実際に表示されるパラメーターです。

@Html.Label(parameter1)のコールでは、<label for="parameter1">parameter1</label>となります。

IDは「。」で始まるため、 javascriptとjQueryの呼び出しでは、基になるコードは最後の "。"の後にparameter1の最後のセクションのみを取ります。

私が何をしているのかは、私が探していたものを達成するための自分の@ Html.Span拡張メソッドを作成することでした。私はこれがMrGriggの質問に正確に答えるものではないことを理解していますが、これを見つけた誰かが役に立つと願っています。

internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string labelText = null) { 
     string resolvedLabelText = labelText ?? metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
     if (String.IsNullOrEmpty(resolvedLabelText)) { 
      return MvcHtmlString.Empty; 
     } 

     TagBuilder tag = new TagBuilder("label"); 
     tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
     tag.SetInnerText(resolvedLabelText); 
     return tag.ToMvcHtmlString(TagRenderMode.Normal); 
    } 
+0

これは良い答えだと思います。問題は、私が組み込みのメソッドから欲しかった結果を得ていないということでした。当時、私はこのようなヘルパーを作ることについて考えていなかったので、これは素晴らしいことだと思います。来て、私たちの未来を助けてくれてありがとう。 – MrGrigg

0

@html:

@model Models.Product 

私のコントローラは、このようなアクションの結果をレンダリングします。ラベル(Model.CatalogName.ToString()+ "-ProductNumber"、 "製品番号")

+0

応答をありがとうが、それは私に同じ結果を与える。 – MrGrigg

0

おそらく、連結を行うモデルクラスにメソッドまたはプロパティを定義する必要があります。

ことができない場合は、試してみてください。

@Html.Label((Model.CatalogName + "-ProductNumber").ToString(), "Product Number") 
+0

何も動かず、今は悲しいです。しかし、提案を提供していただきありがとうございます。私はただRTMのリリースを待つだろうし、おそらくそれは動作不能である私のインストールで間違いを修正するか、不具合を修正するだろう。 – MrGrigg