如何从控制器中调用 EditorFor

7
我有一个位置列表。
public class Location
{
    public string LocationName { get; set; }
    public string Address { get; set; }
}

我为这个类创建了一个编辑器模板。
<div>
   <span>@Html.TextBoxFor(a => a.LocationName)</span>
   <span style="color: red;">@Html.TextBoxFor(a => a.Address )</span>
</div>

问题在于我的页面使用ajax加载位置,然后我将把结果发送回服务器。 但是如何获取具有特定索引的位置?我的意思是对于第一个位置,它将生成类似于此的内容:
<input type="text" name="Locations[0].LocationName" />

当我按下“添加位置”按钮时,第二个位置应该从服务器获取该位置(来自控制器的操作作为html字符串),但索引应为1而不是0,因为这是下一个位置。有可能实现吗?或者我做错了什么?

我会将这种方法改为使用REST服务端点来处理位置,并通过该服务来保存/加载位置。 - vittore
创建 LocationController: ApiController 并实现其中的 Get()Get(id)Put(id)Post(id) 方法。使用 jQuery 接收/发送 JSON 到服务端。 - vittore
但我不使用 REST 服务,我只有控制器和动作 GetLocation(int index),根据此索引,我希望返回控制。 - Sergey
1
这是一个不错的方法,但我想使用经典的MVC和简单的HTML表单,这样当我保存位置时,它会将所有位置发送到服务器。 - Sergey
2个回答

3

类似这样的

    [HttpGet]
    public virtual ActionResult LocationEditor(int index)
    {
        ViewData.TemplateInfo.HtmlFieldPrefix = string.Format("Locations[{0}]", index);
        return PartialView(@"EditorTemplateExplicitPathAsOnlyViewNameAintGonnaWork.cshtml");
    }

在处理地点名称容器时,需要注意以下几点。
<div class="locations-container" data-item-count="@Model.Count">
    @for (int j = 0; j < Model.Count; j++)
    {
        @Html.EditorFor(model => model[j])
    }
    <a href="#" class="add-location">Add Location</a>
</div>

剩下的一点点javascript代码是用于在添加数据时递增“data-item-count”,并调用新索引的“LocationNameEditorLocationNameEditor”操作。

这真是超级解决方案!!!你用这个解决方案真是超级棒!非常感谢你,伙计!我会使用这个解决方案。我忘记了我们可以直接更改HtmlFieldPrefix属性!再次感谢你!!! - Sergey

2

您可以尝试使用部分视图,并创建一个返回AjaxResult的操作方法(我相信这是正确的)。然后,您可以让控制器填充视图模型并将其传递给要呈现在指定位置的部分视图。


没错,我只是不喜欢在可以使用纯数据的情况下从ajax请求中接收html块。 - vittore
要么这样做,要么通过调用主要操作重新渲染整个页面,或者像其他人建议的那样创建自己的REST服务。 - fourpastmidnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接