1

私は現在、(Razorビューエンジンを使用して)最初のMVC3アプリケーションに取り組んでおり、必要な機能の多くを提供する(そして見栄えも良い)オープンソースのTelerikQ12012コントロールを使用することにしました。現在私が抱えている問題は、TelerikEditorコントロールの使用とビューモデルへのバインドです。ViewModelの値を正しく返す標準のHtml.EditorFor()コントロールがページにありますが、TelerikEditorにバインドされているプロパティがnullです。彼らのドキュメントは完全に役に立たず(一度だけEditorForについて言及しているだけです)、フォーラムでもあまりにも多くの質問に答えているようには見えません。私の主な質問は、Telerik MVC3 Editorをモデルにバインドし、それにバインドされているプロパティを設定するにはどうすればよいですか?ビューモデルの私のコードは以下のとおりです(あなたが提供できる助けに感謝します、

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);
    }
4

2 に答える 2

3

私はこれを機能させることができました。ドキュメントは非常に古くなっているか、これをうまく行う方法を説明していません(おそらく両方)。しかし、Razor構文に次の変更を加えることで、これを機能させることができました。

        <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>

コントロールから「Name」プロパティを削除すると、何も戻らないという問題は解決しましたが、保存しようとするとすぐにエラーが発生し(XSS、クロスサイトスクリプティングに関係する)、それはHTMLはエンコードされていませんでした。Encodeプロパティをtrueに変更しましたが、これですべて問題ありません。

于 2012-04-09T00:37:37.343 に答える
0

今日、同じようなことに出くわしました。

ビューモデルを使用していて、バインドしたいプロパティは、ビューモデルの子オブジェクトのプロパティでした。

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

とにかく、それをバインドしたい場合は、RTEにプロパティの正確な名前を指定する必要があります。

.Name("DetailMessage") 

動作するはずですが

.Name("DetailMessageEditor") 

しない。

私の場合、RTEに名前を付ける必要がありました

.Name("object.Property") 

ここで、objectは、プロパティを機能させるためにプロパティが存在するViewモデルの子オブジェクトです。

これが誰かを助けることを願っています。

于 2012-05-28T10:51:57.277 に答える