2012-04-04 14 views
1

私は現在、(Razorビューエンジンを使用して)働いている最初のMVC3アプリケーションで作業しています。オープンソースのTelerik Q1 2012コントロールは、私が必要とする機能をたくさん提供してくれるので便利です。今私が抱えている問題は、Telerik Editorコントロールを使用して、ビューモデルにバインドすることです。 ViewModelの値を正しく返すページに標準のHtml.EditorFor()コントロールがありますが、Telerik Editorにバインドされているプロパティはnullです。彼らのドキュメントはまったく役に立たず(EditorForを一度だけ言及しています)、フォーラムでもあまりにも多くの質問に答えるようには見えません。私の主な質問は、Telerik MVC3エディタをモデルにバインドする方法と、それにバインドされたプロパティを設定する方法です。ビューモデルのための私のコードは以下の通りです(あなたが提供できる助けをしてくれてありがとう、私はMVCのまったく新しいものです。私はこのプロジェクトを自分でやっています。グループ):Telerik MVC 3(Razor)Q1 2012エディタEditorFor()バインディング戻り値NULL値と控えめな検証が機能しない

public class SupportViewModel 
{ 
    [Display(Name = "Ticket Subject")] 
    [MaxLength(30)] 
    [Required(ErrorMessage = "The ticket subject is required.")] 
    public string TicketSubject { get; set; } 

    [Display(Name = "Support Issue")] 
    [Min(1, ErrorMessage = "You must select a support issue.")] 
    public int SupportIssueID { get; set; } 

    [Display(Name = "Ticket Priority")] 
    [Min(1, ErrorMessage = "You must select a ticket priority.")] 
    public int TicketPriorityID { get; set; } 

    //public string EmployeeID { get; set; } 
    public bool IsClosed { get; set; } 

    [Required(ErrorMessage = "The detail message is required.")] 
    public string DetailMessage { get; set; } 
} 

コードの表示:

@model RadixMVC.ViewModels.SupportViewModel 

@{ 
    ViewBag.Title = "Create New Support Ticket"; 
} 

<h2>Radix Support: Create New Support Ticket</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset style="width: 500px"> 
     <legend>Create New Support Ticket</legend> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.TicketSubject) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.TicketSubject) 
      @Html.ValidationMessageFor(model => model.TicketSubject) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.SupportIssueID) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("SupportIssueID", string.Empty) 
      @Html.ValidationMessageFor(model => model.SupportIssueID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.TicketPriorityID) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("TicketPriorityID", string.Empty) 
      @Html.ValidationMessageFor(model => model.TicketPriorityID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.IsClosed) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.IsClosed) 
      @Html.ValidationMessageFor(model => model.IsClosed) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.DetailMessage) 
     </div> 
     <div class="editor-field"> 
      @*@Html.EditorFor(model => model.DetailMessage)*@ 
      @Html.ValidationMessageFor(model => model.DetailMessage) 

      <br /> 

      @{ Html.Telerik().EditorFor(model => model.DetailMessage) 
        .Name("DetailMessageEditor") 
        .HtmlAttributes(new { style = "height: 200px" }) 
        .Encode(false) 
        .Render(); 
      } 
     </div> 

     <div> 
      <br /> 
      <input type="submit" value="Create Ticket" title="Submits a new support ticket" /> 
      <input type="submit" onclick="parent.location='@Url.Action("Index", "Support", "Index")'" value="Cancel" title="Return to Support Home" /> 
     </div> 
    </fieldset> 
} 

そして最後に、コントローラコード:

[HttpPost] 
    public ActionResult Create(SupportViewModel vm) 
    { 
     if (ModelState.IsValid) 
     { 
      SupportTicket SupportTicket = new SupportTicket() 
      { 
       SupportTicketID = Guid.NewGuid(), 
       EmployeeID = "123456", 
       TicketOpenDate = DateTime.Now, 
       TicketModifiedDate = DateTime.Now, 
       IsClosed = vm.IsClosed, 
       TicketSubject = vm.TicketSubject, 
       SupportIssueID = vm.SupportIssueID, 
       TicketPriorityID = vm.TicketPriorityID 
      }; 

      TicketDetail TicketDetail = new TicketDetail() 
      { 
       TicketDetailID = Guid.NewGuid(), 
       SupportTicketID = SupportTicket.SupportTicketID, 
       TicketOrder = 1, 
       EmployeeID = "123456", 
       DetailDate = DateTime.Now, 
       DetailMessage = vm.DetailMessage 
      }; 

      SupportTicket.TicketDetails.Add(TicketDetail); 
      db.SupportTickets.Add(SupportTicket); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.SupportIssueID = new SelectList(db.SupportIssues, "SupportIssueID", "Name", vm.SupportIssueID); 
     ViewBag.TicketPriorityID = new SelectList(db.TicketPriorities, "TicketPriorityID", "Name", vm.TicketPriorityID); 

     return View(vm); 
    } 

答えて

3

私はこの作業を取得することができました。ドキュメントは非常に古くなっているか、これをどうやって(おそらく両方で)行うのか説明していないだけです。しかし、私は私のカミソリの構文に次の変更を行うことで、この作業を取得することができました:

コントロールから「名前」プロパティを削除
 <div class="editor-label"> 
     @Html.LabelFor(model => model.DetailMessage) 
    </div> 
    <div class="editor-field"> 
     @*@Html.EditorFor(model => model.DetailMessage)*@ 
     @Html.ValidationMessageFor(model => model.DetailMessage) 

     <br /> 

     @{ Html.Telerik().EditorFor(model => model.DetailMessage) 
       //.Name("DetailMessageEditor") 
       .HtmlAttributes(new { style = "height: 200px" }) 
       .Encode(true) 
       .Render(); 
     } 
    </div> 

が戻って何かを得ていないという問題を解決し、私は保存しようとしたとき、すぐにエラーが発生しました(XSS、クロスサイトスクリプティングと関係があります)、HTMLがエンコードされていなかったためです。私はEncodeプロパティをtrueに変更しましたが、今はすべて良いです。

0

今日も同様の事が起きています。

私はView Modelを使用していました。私がバインドしたいプロパティはView Modelの子オブジェクトのプロパティでした。

私が提出したとき、RTEの値はバインドされていませんでした。私はRequest.Fromオブジェクトを見て、私は値が通常の方法でバインドするための正しい形式で返されていたので、私は少し混乱していたことがわかりました。とにかく

、あなたはそれをバインドしたい場合は、あなたのケースで

.Name("DetailMessage") 

が動作するはずですので、RTEにあなたの財産の正確な名前を与える必要がなく、

.Name("DetailMessageEditor") 

ますない。

イム私の場合は、私は、オブジェクトが私の財産は、これは誰かに役立ちます

希望を動作させるために住んでいるビューモデルの子オブジェクトであるRTE

.Name("object.Property") 

に名前を付ける必要がありました。

関連する問題