1

我有具有多对多关系和播种的模型(代码优先)和数据库(SQL Server)设置:

一个地方可以有很多标签(例如餐厅、酒吧、咖啡馆)——标签可以属于很多地方。

Place
[ScaffoldColumn(false)]
public virtual int PlaceID { get; set; }

[Required(ErrorMessage = "Place Name is required")]
[StringLength(100)]
public virtual string Name { get; set; }

[Required]
public virtual string Address {get;set;}

public virtual string ImageLogo {get;set;}
public virtual string ImageBackground {get;set;}


Tag
public virtual int TagID { get; set; }

[Required]
public virtual string Name { get; set; }

[Required]
public virtual string NamePlural { get; set; }

public virtual ICollection<Place> Places { get; set; }

EF Migrations 生成了一个带有 TagID 和 PlaceID 的联结表,我可以在我的 Seed 方法中添加具有多个标签的 Places。大约有 50 个标签 - 全部为种子。

我想做的是有一个创建视图表单——它允许用户从所有标签中进行选择——可能带有复选框(对替代品开放)、一些异步文本框等?然后将其与模型一起保存。

此数据将由管理员输入 - 输入速度是最重要的(不一定是 100% 傻瓜证明)。

我还需要能够编辑该地点 - 并适当地显示这些标签以删除或添加其他标签。

也是处理删除地点的最佳方法 - 首先删除联结表中的记录?

以上所有方面的最佳做法是什么?

谢谢。

4

1 回答 1

1

我认为对你来说最好和最简单的方法是你有一个创建视图,Place并在它的底部放置一个fieldset为它分配标签。

对于字段集,您应该创建两个局部视图:一个用于创建,另一个用于编辑。创建的部分视图应该是这样的:

@model myPrj.Models.PlaceTagInfo

@{ 
    var index = Guid.NewGuid().ToString(); 
    string ln = (string)ViewBag.ListName;
    string hn = ln + ".Index";
}

<tr>
    <td>        
        <input type="hidden" name="@hn" value="@index" />
        @Html.LabelFor(model => model.TagID)
    </td>
    <td>
        @Html.DropDownList(ln + "[" + index + "].TagID", 
            new SelectList(new myPrj.Models.DbContext().Tags, "ID", "TagName"))
    </td>        
    <td>
        <input type="button" onclick="$(this).parent().parent().remove();" 
            value="Remove" />
    </td>
</tr>

通过 ajaxly 在 create place view 中调用这个局部视图,您可以为每个标签呈现一些元素。每行元素都包含一个标签、一个包含标签的 DropDownList 和一个删除按钮,用于简单地删除创建的元素。

在创建地点视图中,您有一个裸表,其中包含您通过部分视图创建的那些元素:

<fieldset>
     <legend>Place Tags</legend>
     @Html.ValidationMessageFor(model => model.Tags)</label>
     <table id="tblTags"></table>                                        
     <input type="button" id="btnAddTag" value="Add new tag"/>
     <img id="imgSpinnerl" src="~/Images/indicator-blue.gif" style="display:none;" />
</fieldset>

并且您有以下脚本来为每个标签创建一行元素:

$(document).ready(function () {
    $("#btnAddTag").click(function () {
        $.ajax({
            url: "/Controller/GetPlaceTagRow/Tags",
            type: 'GET', dataType: 'json',
            success: function (data, textStatus, jqXHR) {
                $("#tblTags").append(jqXHR.responseText);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                $("#tblTags").append(jqXHR.responseText);
            },
            beforeSend: function () { $("#imgSpinnerl").show(); },
            complete: function () { $("#imgSpinnerl").hide(); }
        });
    });
});

动作方法GetPlaceTagRow如下:

public PartialViewResult GetPlaceTagRow(string id = "")
    {            
        ViewBag.ListName = id;
        return PartialView("_CoursePostPartial");
    }

并且您已完成创建...您问题的整个解决方案有许多用于视图、部分视图、控制器、ajax 调用和模型绑定的代码。我试图向您展示方式,因为我真的无法在此答案中发布所有这些。

希望这个答案对您有用并为您指明方向。

于 2013-07-25T06:35:00.367 回答