2012-04-04 21 views
1

我目前正在使用我的第一個MVC3應用程序(使用Razor視圖引擎),並決定使用開源的Telerik Q1 2012控件,因爲它們將提供我需要的許多功能(並且看起來不錯)。現在我遇到的問題是使用Telerik Editor控件並綁定到我的視圖模型。我在頁面上具有標準的Html.EditorFor()控件,該控件正確返回ViewModel中的值,但綁定到Telerik Editor的屬性爲null。他們的文檔完全沒用(它只提到了Editor的一次),而且他們似乎也沒有在論壇上回答太多問題。我的主要問題是,我如何將Telerik MVC3編輯器綁定到模型,並讓它設置綁定到它的屬性?我的視圖模型的代碼如下(感謝您提供的任何幫助,請記住,我是MVC的全新人物,我自己在做這個項目以熟悉它,並將一些新技術引入該組):Telerik MVC 3(Razor)2012年第一季度編輯EditorFor()綁定返回空值和不顯眼驗證不起作用

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

今天遇到類似的事情。

我在使用視圖模型,我想綁定的屬性是視圖模型中的子對象的屬性。

當我提交時,RTE中的值沒有被綁定。當我查看Request.From對象時,我可以看到該值以正確的格式返回,以通常的方式綁定,所以我有點困惑。

無論如何,如果你想讓它綁定你需要給你的財產給了RTE的確切名稱,以便在您的情況

.Name("DetailMessage") 

應該工作,但

.Name("DetailMessageEditor") 

會不。

林我來說,我不得不命名RTE

.Name("object.Property") 

object是在哪裏我的財產生命去得到它的工作

希望這可以幫助別人視圖模型子對象。

相關問題