MvC4在同一行使用2个提交表单

时间:2013-11-15 01:13:05

标签: asp.net-mvc-4 submit row

所以这是代码,当我按下“开始”时,我有2个提交按钮我希望它将Datetime.now发送到开始行,当我按“停止”时,我希望它发送停止日期时间。现在到列,这应该发生在同一行。当我再次按Start时,它应生成一个新的ID 2,等等。在第二行打印开始日期。

Exampel ID 1:Start 2013-11-15 05:12 Slut:2013-11-15 05:15

问候Patrik

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Start)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Start, new { style = "display: none;", @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Start)
        </div>
         <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)" value="Start" formaction="/tider/create" />
        </p>

    }
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Slut)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Slut, new { @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Slut)
        </div>
        <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)"  value="Stop" />
        </p>
    }
</fieldset>

            <div class="editor-label">
                @Html.LabelFor(model => model.Slut)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.Slut, new { @Value = @DateTime.Now })
                @Html.ValidationMessageFor(model => model.Slut)
            </div>

            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }

控制器     {         公共类TiderController:Controller         {             private TiderDBContext db = new TiderDBContext();

        //
        // GET: /Tider/

        public ActionResult Index()
        {
            return View(db.Tider.ToList());
        }

        //
        // GET: /Tider/Details/5

        public ActionResult Details(int id = 0)
        {
            ArbetsTider arbetstider = db.Tider.Find(id);
            if (arbetstider == null)
            {
                return HttpNotFound();
            }
            return View(arbetstider);
        }

        //
        // GET: /Tider/Create

        public ActionResult Create()
        {
            return View();
        }

        //
        // POST: /Tider/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(ArbetsTider arbetstider)
        {
            if (ModelState.IsValid)
            {
                db.Tider.Add(arbetstider);
                db.SaveChanges();

            }

            return View(arbetstider);
        }

        //
        // GET: /Tider/Edit/5

        public ActionResult Edit(int id = 0)
        {
            ArbetsTider arbetstider = db.Tider.Find(id);
            if (arbetstider == null)
            {
                return HttpNotFound();
            }
            return View(arbetstider);
        }

        //
        // POST: /Tider/Edit/5

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(ArbetsTider arbetstider)
        {
            if (ModelState.IsValid)
            {
                db.Entry(arbetstider).State = EntityState.Modified;

               return RedirectToAction("Index");
            }
            return View(arbetstider);
        }

        //
        // GET: /Tider/Delete/5

        public ActionResult Delete(int id = 0)
        {
            ArbetsTider arbetstider = db.Tider.Find(id);
            if (arbetstider == null)
            {
                return HttpNotFound();
            }
            return View(arbetstider);
        }

        //
        // POST: /Tider/Delete/5

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            ArbetsTider arbetstider = db.Tider.Find(id);
            db.Tider.Remove(arbetstider);
            db.SaveChanges();
           return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        [HttpPost]
        public ActionResult Start(ArbetsTider model)
        {
            using (var context = new TiderDBContext())
            {
                context.Tider.FirstOrDefault(x => x.ID == model.ID).Start = model.Start;
                context.SaveChanges();
            }
            return View("Index");
        }

        [HttpPost]
        public ActionResult Stop(ArbetsTider model)
        {
            using (var context = new TiderDBContext())
            {
                context.Tider.FirstOrDefault(x => x.ID == model.ID).Slut = model.Slut;
                context.SaveChanges();
            }
            return View("Index");
        }
    }
}

模型

public class ArbetsTider
{
    public int ID { get; set; }
    public DateTime Start { get; set; }
    public DateTime Slut { get; set; }

}

public class TiderDBContext : DbContext
{
    public DbSet<ArbetsTider> Tider { get; set; }
}

3 个答案:

答案 0 :(得分:0)

默认情况下,HTML并不能很好地处理多个表单。

例如,您不能使用嵌套表单:

<form action="/GreatController/DecentAction">
    <input type="submit" value="Start" />

    <form action="/GoodController/ModerateAction">
        <input type="submit" value="Stop" />
    </form>

</form>

即使您使用两个不同的按钮,也不能让表单使用相同的数据(仅使用HTML)执行两个不同的操作。

有几种解决方法。

  1. Javascript - 您可以使用Javascript以各种方式为您提供帮助。当您使用特定按钮提交时,它可以创建新的隐藏表单,创建隐藏字段或只是更改表单的action。可能性很多。
  2. 重新思考 - 问问自己是否可以实现相同的功能,但要以不同的方式进行。
  3. 拆分表单 - 您是否可以将表单分成两种形式?请记住,表单只需要包含执行操作所需的数据(即输入字段),它们不需要包含大量不相关的HTML。

答案 1 :(得分:0)

这样的事情怎么样?

<fieldset>
    <legend>ArbetsTider</legend>

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Start)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Start, new { style = "display: none;", @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Start)
        </div>
        <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)" value="Start" formaction="/tider/create" />
        </p>
    }
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Slut)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Slut, new { @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Slut)
        </div>
        <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)"  value="Create" />
        </p>
    }
</fieldset>

将字符串属性名称“Command”添加到您的模型中,并在您的操作中,如果"model.Command" == "Start"执行一项操作,则执行另一项操作,例如"model.Command" == "Create"

[HttpPost]
public ActionResult MultipleCommand(string Command)


    if (model.Command == "Start")
    {
        //TO DO : Submit button for first row
    }
    else if (model.Command == "Stop");
    {
        //TO DO : Submit to second row
    }
}

答案 2 :(得分:0)

开玩笑说:

    @using (Html.BeginForm("Start"))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Start)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Start, new { style = "display: none;", @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Start)
        </div>
         <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)" value="Start" formaction="/tider/create" />
        </p>

    }

    @using (Html.BeginForm("Stop"))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div class="editor-label">
            @Html.LabelFor(model => model.Slut)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Slut, new { @Value = @DateTime.Now })
            @Html.ValidationMessageFor(model => model.Slut)
        </div>
        <p>
            <input type="submit" name="@Html.NameFor(x => x.Command)"  value="Stop" />
        </p>
    }

在控制器中

[HttpPost]
public ActionResult Start(IDontKnowYourModel model){
 using(var context = new TiderDBContext()) {
   context.Tider.FirstOrDefault(x => x.ID == model.ID).Start = model.Start;
   context.SaveChanges();
 }
 return View("Index");
}

[HttpPost]
public ActionResult Stop(IDontKnowYourModel model){
 using(var context = new TiderDBContext()) {
   context.Tider.FirstOrDefault(x => x.ID == model.ID).Slut = model.Slut;
   context.SaveChanges();
 }
 return View("Index");
}

注意:通常在中间添加一个额外的DAL图层,就像存储库一样。我没有这样做,以保持简洁。

您应该做的就是在表单中定义它应指向的操作方法。 你的问题有点不清楚(你在同一行上的意思是什么?),所以根据你的用例,你可能需要为每个表单添加一个隐藏字段来确定你想要更新的模型的ID。