【问题标题】:Define an array in my model在我的模型中定义一个数组
【发布时间】:2015-04-06 18:15:28
【问题描述】:

我正在创建一个表单来将数据放入数据库。现在我想使用一个数组,因为我想在一个表单中放置一个表单。例如,您有一个表单,用户在其中放置有关自己的信息,例如年龄名称等。一个问题是关于他的朋友,你必须填写你所有朋友的名字和年龄。因为您有多个朋友,所以您可以添加多个朋友。所以你填写一个朋友的姓名和年龄,点击保存,然后你可以继续填写另一个朋友的信息。当您单击保存时,您不会保存整个表单。

希望我能解释清楚。

这是我的表格:

public class User
{
    [BsonElement("Id")]
    public int Id { get; set; }

    [BsonElement("Email")]
    public string Email { get; set; }

    [BsonElement("Name")]
    public string Name{ get; set; }

    [BsonElement("Company")]
    public string Company { get; set; }

    [BsonElement("Array friends")]

}

查看:

@model ISPInvoice.Models.Invoice
@using (Html.BeginForm("Edit", "Home"))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>New Note</legend>
        <h3>New Note</h3>
        <div class="editor-label">
            @Html.LabelFor(model => model.InvoiceNumber)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.InvoiceNumber)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

【问题讨论】:

  • 我认为这是有道理的,但我不能 100% 确定你在问什么。你想在这里得到什么帮助?是否将数组属性添加到模型类?是允许动态输入的客户端代码吗?如何嵌套表单(你不能,但我们可以想出一个可行的替代方案)?
  • 嗯,我想在一个表格里面做一个表格。但是,如果我使用类似下面答案的列表,我就无法调用正确的变量。我可以从用户那里调用model.Name,但我不能从朋友那里调用model.Name。
  • 为此,您需要在列表上运行 for 循环并访问列表中的每个对象。
  • 遇到了你的问题,但是你不能有嵌套的表单,你可以使用任何 javascript 框架管理这个客户端吗(如果你想在点击时立即保存这些朋友,请使用 ajax)并在保存时保存整个表单.

标签: c# asp.net .net arrays


【解决方案1】:

添加另一个名为 Friend 的类

public class Friend
{

[BsonElement("Name")]
public string Name { get; set; }

[BsonElement("Age")]
public int Age{ get; set; }    

}

在你的 User 类中添加一个朋友列表。

public class User
{

[BsonElement("Id")]
public int Id { get; set; }

[BsonElement("Email")]
public string Email { get; set; }

[BsonElement("Name")]
public string Name{ get; set; }

[BsonElement("Company")]
public string Company { get; set; }

[BsonElement("Array friends")]
public List<Friend> Friends { get;set;}
}

为了访问视图中的好友列表,您可以遍历列表。

@foreach (namespace.Models.Friend friend in Model.Friends)
{
    @Html.LabelFor(item => friend.Name)
}

【讨论】:

  • 是的,这可以工作。但是当我想像model.Name(给朋友)这样在我的视图中使用字符串年龄时它不起作用,我只能使用model.Email, model.Name等。
  • 您尝试将这些数据绑定到视图中的哪个控件?
  • 我不明白你的问题
  • 不,我不使用网格视图
  • 我正在使用这个模型制作表格
【解决方案2】:

听起来您需要一些客户端代码。

据我了解您的需要,我可能会做的是在您与已选择的朋友一起更新的表单中隐藏输入。

问题在于标准表单编码不支持分层数据,因此您需要手动添加对它的支持。如您所见,这并不太难,但这很麻烦。如果您使用像 Angular 这样的框架,或者甚至只是使用 AJAX 发布,这将非常容易。但这是一个相当大的变化,可能不值得仅仅为了这种情况而经历和实施。

这个例子依赖于 jQuery。它也超级简单,不支持删除或编辑现有朋友。不过,您应该可以很容易地添加这些东西。它也绝对不会对任何事情进行验证,因此请随心所欲。

var friends = [];

function refreshHiddenField() {
  $("#friendsListText").val(friends.map(function(d) { return d.name + "=" + d.age }).join(";"));
}

document.addEventListener("DOMContentLoaded", function(event) { 
$("#btnAddFriend").click(function() {
  var name = $("#newFriendName").val();
  var age = $("#newFriendAge").val();
  
  friends.push({ name : name, age: age });
  refreshHiddenField();

  var li = $("<li />").text(name + " (" + age + ")");

  $("#friendsList").append(li);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<!-- This will actually be an @Html.HiddenFor(m => m.FriendsText), or something -->
<input type="text" id="friendsListText" readonly placeholder="Add some friends first" />

<hr />

<input type="text" id="newFriendName" placeholder="Name" />
<input type="number" id="newFriendAge" placeholder="Age" />

<button type="button" id="btnAddFriend">Add!</button>

<br />

<ul id="friendsList">
</ul>

您会发现使用该示例(尽管测试非常简单),添加朋友会将详细信息附加到用户可见的列表中,并将机器可读的格式附加到输入中。根据评论,此输入在此示例中可见,以查看发生了什么,但不会在生产中。

完成客户端代码后,您只需在保存时解析隐藏字段。假设 Friend 类具有 string Nameint Age 的属性,

[HttpPost]
public ActionResult EditProfile(User m)
{
    // Unrelated stuff

    var friends = m.FriendsText.Split(';').Select(c => {
        var args = c.Split('=');

        return new Friend { Name = args[0], Age = int.Parse(args[1]) };
    })

    // Use the collection
    // Unrelated stuff
}

这只是一些非常简单的字符串操作,使用 LINQ 和 Split 函数来理解客户端的机器可读格式。

请注意,在此实现中,名称中不能有分号或等号。


一旦你把它全部输入,打印出来就很容易了。只是,是的,向您的模型添加一个集合类型,然后使用 foreach 循环进行循环。

<ul>
    @foreach (var f in Model.FriendsCollection)
    {
        <li>@f.Name (@f.Age)</li>
    }
</ul>

我知道这不是你在说的,但我提供这个只是作为一个示例,说明如何根据你最初的问题在模型中包含一个集合。

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多