如何将对象时间戳与对象id连接起来并将它们传递给action方法

时间:2014-07-29 14:30:59

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我的asp.net mvc视图中有以下代码: -

@foreach (var item in Model)
{<tr><td>

 <input type="checkbox" class="checkBoxClass" name="CheckBoxSelection" 
 value="@item.TMSServerID.ToString()"/> </td>

将呈现一个以objectid作为其值的复选框。 我编写了以下脚本,它将收集所选对象的所有ID: -

var boxData = [];

        $("input[name='CheckBoxSelection']:checked").each(function () {
            boxData.push($(this).val());
        });

    }

         $.ajax({
             type: "POST",
             url: URL,
             data: { ids: boxData.join(",")}
            //code goes here

接受id的动作方法如下: -

public ActionResult TransferSelectedServers(string ids)
if (ModelState.IsValid)
            {
                try
                {
                    var serverIDs = ids.Split(',');

现在我想要实现的是我希望复选框包含一个连接objectid + timestamp的字符串。目前,对象id的类型为int,时间戳类型为byte []。

但我有以下两个问题: -

1.如何将时间戳转换为字符串并将其与id连接,例如: -

@foreach (var item in Model)
    {<tr><td>

     <input type="checkbox" class="checkBoxClass" name="CheckBoxSelection" 
     value="@item.TMSServerID.ToString()"+ "@item.timestamp.ToString()"/> </td>

2.在我的动作方法中,如何在分割字符串之后再将表示时间戳的字符串转换为byte []?

此致

3 个答案:

答案 0 :(得分:1)

1)用于连接字符串的代码很接近,但是你需要在那里抛出某种分隔符来找出一个值停止而另一个值开始的位置。如果ID是int,则可以使用任何非int字符作为分隔符。类似的东西:

value="@string.Format("{0},{1}", item.TMSServerID, item.timestamp)"

......将我们带到

2)上面不会给你你想要的东西,因为byte []。ToString()只会给你&#34; System.Byte []&#34;。为什么时间戳是一个byte []?那是什么格式的?那是来自SQL吗?我的建议是将该字节[]转换为DateTime,如果可以的话,它更容易使用。

一旦成为DateTime,您就可以在串联中使用item.timestamp.Ticks。然后,这是一个简单的AJAX处理程序来执行此操作:

string[] parts = ids.Split(',');
int id = int.Parse(parts[0]);
DateTime timestamp = new DateTime(long.Parse(parts[1]));

答案 1 :(得分:1)

我似乎总是偶然发现你的问题John G.

回答问题1

您已使用连锁属性关闭,而您只是忽略了剃刀语法的括号。

value="@(item.TMSServerID.ToString() + System.Text.Encoding.Default.GetString(@item.timestamp))"

回答问题2

你需要一种再次分割字符串的方法。所以你可以传递一个分裂字符,例如&#34; - &#34;

value="@(item.TMSServerID.ToString() + "-" + System.Text.Encoding.Default.GetString(@item.timestamp))"

然后你可以在你的控制器中拆分它

var serverIDs = ids.Split(',');

foreach (var serverid in serverIDs)
{
      var split = serverid.Split('-');

      var name = split[0];
      byte[] bytearray = Encoding.Default.GetBytes(split[1]);
}

虽然这是一个解决方案,但我建议您将所需的值绑定到模型中。我不喜欢在应用程序中拆分和连接字符串,因为它们可能会导致各种各样的问题。

因此,我建议阅读@wertzui提供的答案。

答案 2 :(得分:0)

编写一个包含所有所需属性的ViewModel类:

public class ItemClass
{
    public bool Checked {get;set;}
    public int TMSServerID {get;set;}
    public byte[] Timestamp {get;set;}
}

然后在主视图中使用一个简单的EditorFor,它将自动为您呈现集合:

@Html.EditorFor(model => model)

在EditorTemplates子文件夹中有一个ItemClass.cshtml,以便上面的EditorFor将使用它:

<tr>
    <td>
        @Html.EditorFor(model => model.Checked)
        @Html.HiddenFor(model => model.TMSServerID)
        @Html.HiddenFor(model => model.TimeStamp)
    </td>
</tr>

在你的js文件中,只需使用serialize来序列化表单:

var form = $(this).parents('form');
        $.ajax({
            type: form.attr('method'),
            url: URL,
            data: form.serialize(),
        }

在您的控制器操作中,您可以迭代您的收藏并检查每个项目是否已被检查:

[HttpPost]
public ActionResult MyAction(Model myModel)
{
    foreach(var item in myModel)
    {
        if(item.Checked)
        {
            // do something
        }
    }
}