2012-04-04 18 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是在哪里我的财产生命去得到它的工作

希望这可以帮助别人视图模型子对象。

相关问题