【问题标题】:MVC View Textbox string input to TimeSpan to Time in Seconds IntegerMVC View Textbox string input to TimeSpan to Time in Seconds Integer
【发布时间】:2009-06-08 01:19:18
【问题描述】:

我有一个 LINQ to SQL 实体类,它具有一个名为 sTime 的可为空的 int 属性,我用它来记录为任务安排的秒数。例如数据库字段120000

我尝试向 Task 类添加一个属性,但是当我使用 LINQ to SQL 实体时如何初始设置此属性。

public TimeSpan ScheduledTimeSpan {get; private set;}

int seconds = sTime ?? 0;
TimeSpan ts = new TimeSpan(0, 0, 0, seconds, 0);
ScheduledTimeSpan = ts;

我会在我的视图中这样做

<td><%= Html.Encode(task.ScheduledTimeSpan.TotalSeconds.ToString("hh:mm:ss")) %></td>

使用 MVC,我不确定在使用 UpdateModel(task); 时如何以及在何处正确设置和获取 sTime;在我的任务控制器中。我在想我需要在执行 Get 时在控制器操作中创建一个 TimeSpan ,但这对我来说似乎不正确,我应该在哪里设置这个属性?谁能帮忙?

【问题讨论】:

  • 你能澄清你想要什么吗?我不确定您是否想知道如何最好地将 sTime 作为时间跨度,或者您是否想知道如何发布表单然后将一些数据设置/绑定到 sTime 或完全不同的东西! :-) 干杯,查尔斯。

标签: asp.net-mvc properties


【解决方案1】:

是的,现在说得通了。 :-)

这就是我的处理方式......

TaskClass 的部分类

public partial class Task
{
    public TimeSpan ScheduledTimeSpan
    {
        get
        {
            int seconds = sTime ?? 0;
            return new TimeSpan(0, 0, seconds);
        }

        set
        {
            if (value != null)
                sTime = (int)value.TotalSeconds;
        }
    }
}

然后改变你的看法

<p>
    <label for="ScheduledTimeSpan">Scheduled Time:</label>
    <%= Html.TextBox("ScheduledTimeSpan", Model.Task.ScheduledTimeSpan.ToString("hh:mm:ss"))%>
    <%= Html.ValidationMessage("ScheduledTimeSpan", "*") %>
</p>

假设模型绑定器将“hh:mm:ss”字符串绑定到时间跨度没有问题,这应该可以正常工作。

如果确实有问题,请告诉我。

HTH, 查尔斯

【讨论】:

  • 感谢您的回复。我还没有尝试过,我已经为这个属性编写了 get 但是这个集合的工作方式让我感到困惑。我正在考虑采用与您在上面展示的相同的方法,我不明白并且需要研究的是它在更新模型方面是如何工作的。我可以看到这个集合正在改变 sTime,但它最终是如何工作的是我不清楚的......目前只能猜测。
  • 当回传来自 ScheduledTimeSpan 表单输入的值时,模型绑定器会将其解析为 TimeSpan,然后设置模型的 ScheduledTimeSpan 属性,进而设置 sTime 属性。因此,它将更新模型。精明吗?
  • NP Pricey,如果您有任何问题,请告诉我 :-)
【解决方案2】:

这是我视图上的输入文本框

            <p>
            <label for="sTime">sTime:</label>
            <%= Html.TextBox("sTime", Model.Task.sTime)%>
            <%= Html.ValidationMessage("sTime", "*") %>
        </p>

这是我的.dbml Designer.cs后面的代码。

        [Column(Storage="_sTime", DbType="Int")]
    public System.Nullable<int> sTime
    {
        get
        {
            return this._sTime;
        }
        set
        {
            if ((this._sTime != value))
            {
                this.OnsTimeChanging(value);
                this.SendPropertyChanging();
                this._sTime = value;
                this.SendPropertyChanged("sTime");
                this.OnsTimeChanged();
            }
        }
    }

这是我的任务控制器中用于编辑操作的代码。

//
// GET: /Tasks/Edit/5

public ActionResult Edit(int id)
{
    Task task = taskRepo.GetTask(id);

    return View(new TaskViewModel(task));
}

//
// POST: /Tasks/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection)
{
    Task task = taskRepo.GetTask(id);

    try
    {
        UpdateModel(task);

        taskRepo.Save();

        return RedirectToAction("Details", new { id = task.taskId });
    }
    catch
    {

    ModelState.AddRuleViolations(task.GetRuleViolations());
        return View(new TaskViewModel(task));
    }
}

sTime 是一个整数(以秒为单位的时间),当它进入数据库字段时,它必须是这个值。但是这个值的接口需要是一个 HH:MM:SS 的字符串。

这就是我尝试使用 TimeSpan 的原因,但我不知道在哪里或如何设置它。

这样是不是更清楚了?

【讨论】:

    猜你喜欢
    • 2022-12-01
    • 2013-05-14
    • 2022-12-27
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多