-1

我正在研究 asp.net mvc 3 应用程序。我正在实现一个具有两个主要功能的剃须刀视图 - 根据数据库中的数据构建/显示表单,并在允许上传和删除的自定义(由我制作)图像库中显示与此表单相关的图像图片。

所以一般来说,这是我对两种表单的看法,用于可视化表单以及显示和上传图像:

@model List<DataAccess.MCS_DocumentFields>

@{
    ViewBag.Title = "Документ";
}
<div id="alabala">
<div id="drawForm">
@using (Html.BeginForm("UpdateDocument", "Forms", FormMethod.Post))
{
    <table border="1" id="drawDocument">
        <colgroup>
            <col span="1" style="width: 10%;" />
            <col span="1" style="width: 40%;" />
            <col span="1" style="width: 25%;" />
            <col span="1" style="width: 25%;" />
        </colgroup>
        @Html.Partial("_PartialHeader", Model)
        @Html.Partial("_PartialDrawing", Model)
        @Html.Partial("_PartialBody", Model)
        @Html.Partial("_PartialFooter", Model)

    </table>
    if (ViewBag.Status == 1)
    {
        <button type="submit" id="submitDocument">Запази</button> 
        <button style="float:right;" id="finalizeDocument">Приключи</button>  
    }
    else
    { 
        @Html.ActionLink("Назад", "Index")
    }
}
</div>
<div id="imageContainer">
<div id="imageGallery" style="overflow: scroll">
 <img src="file:\\..." alt="docImg" style="width: 190px; height: auto"/>
 @Ajax.ActionLink("Delete", "DeletePicture", new { documentID = Model[0].Id },
                        new AjaxOptions
                        {
                            Confirm = "Are you sure?",
                            OnComplete = "$('#blah').attr('src', '#').attr('style', 'display:none;'); $('#Image1').attr('src', '#').attr('style', 'display:none;'); $('#DelPic').attr('style', 'display:none;');"
                        })
 <img src="file:\\..." alt="docImg" style="width: 190px; height: auto"/>
  @Ajax.ActionLink("Delete", "DeletePicture", new { documentID = Model[0].Id },
                        new AjaxOptions
                        {
                            Confirm = "Are you sure?",
                            OnComplete = "$('#blah').attr('src', '#').attr('style', 'display:none;'); $('#Image1').attr('src', '#').attr('style', 'display:none;'); $('#DelPic').attr('style', 'display:none;');"
                        })
</div>
@using (Html.BeginForm("Upload", "Forms", FormMethod.Post))
{

    <input name=@Model[0].DocumentId type="hidden" />

    <input type="file" name="datafile" id="file" onchange="readURL(this);" />
    <input type="button" name="Button" value="Upload" id="UploadButton" onclick="fileUpload(this.form,'/forms/upload','upload'); return false;"/>
    <div id="upload" style="display: inline-block;">
        <img id="blah" src="#" alt="your image" style="display:none;"/>
    </div>
}
</div>
</div>

第一个表单是我显示当前表单/文档数据的地方,因为它们是可编辑的,所以我有提交按钮。我需要第二个表单将选定的图片提交给我的控制器并在那里执行业务逻辑。

因此,一旦选择了一张图片并单击了Upload按钮,我就会进入我的控制器:

public ActionResult Upload(FormCollection collection)
        {
            WebImage UploadImage = WebImage.GetImageFromRequest();
            long documentID;
            string finalImageName = null;
            if (!long.TryParse(collection.AllKeys[0], out documentID))
            //More code...

我有图像和它所属的文档的 ID,我需要执行一些检查/验证,最后将所选图像复制到专用目录并将名称保存到数据库中。

问题是我已经编写了所有逻辑,除了将为不同输出显示正确消息的逻辑,例如:

if (imagePath.Length > 247)
                            {
                                //TODO message that the path is too long
                                //TODO this return View() is temp, replace with something suitable
                                return View();
                            }
                    //...
                         System.IO.File.Copy(UploadImage.FileName, imagePath);
                        }
                        catch (Exception ex)
                        {
                            //TODO copy failed return message
                            return View();
                        }
                    //...

这些都是执行相同方法的不同输出,在主视图中,我想为它们中的每一个显示适当的消息。我不确定我是否仍然可以选择保存我的工作并仍然实现消息逻辑?现在想想,如果我以某种形式使用 Ajax,现在会容易得多,但我不是。我能想到的唯一想法就是创造ViewBag属性,并将其与模型一起返回到视图,在该视图中检查不同的属性并在必要时显示一些消息,但这意味着我的视图中有很多额外的逻辑,从我已经显示的数据库中重新发送数据简而言之,我的观点和大量的双重工作表明,我认为这是一个糟糕的编程,但也许我让自己陷入了这个境地。那么从这里开始最好的行动方案是什么。最好只删除我的代码并寻找一种使用 AJAX 的方法吗?

4

3 回答 3

2

您无法使用 AJAX 上传文件 - 您需要某种第 3 方解决方法。您需要使用适当的模型从 Upload() 方法返回原始视图,以及 ViewBag 中某处的标志以显示消息,例如

public ActionResult Upload(UpdateDocumentModel model) {
...
  if (imagePath.Length > 247) {
    model.ErrorMessage = Errors.Over247;
    return View("UpdateDocument", model);
  }
...
return RedirectToAction("UploadOk");
}

为了便于阅读,我已将您的模型更改FormCollection为强类型模型,这也是 MVC.net 的用途。这Errors.Over247可能是项目中某处的字符串资源,或者是视图随后读取以显示特定 HTML 片段的布尔标志。

于 2013-05-30T08:02:04.197 回答
0

只需使用 TempData 而不是 ViewBag

TempData["ErorrMessegge"] = "SomeMessage to view";


@TempData["ErorrMessegge"]
于 2013-05-30T08:18:00.320 回答
0

您可以简单地使用 TempData[] 将参数从控制器传递到视图,如下所示:

控制器:

[HttpPost]
public ActionResult Add(Applicant applicant)
{
    repository.SaveApplicant(applicant);
    TempData["message"] = "The applicant has been saved succesfully.";
    return View(applicant);
}


看法:

@if (TempData["message"] != null)
{
    <div>@TempData["message"]</div>
}
于 2013-10-31T22:03:41.770 回答