1

問題は、同じビューに 2 つのフォームがあることです。コントローラーはUsers、2 つのフォームに対して 2 つのアクションがあります。Edit と UploadPhoto です。

編集部分をしばらく使用していますが、機能しています。ここで、ユーザーが同じページに写真をアップロードできるようにしたいと考えています。ユーザー情報を保存するためのボタンと、写真を保存するための別のボタンがあります。

ここに画像の説明を入力

ページモデルは@model sportingbiz.Models.ViewModels.UserEditViewModel

第二形態

<fieldset title="Upload photo">
    <legend>Change Profile Picture</legend>
    <div>
        @using(Html.BeginForm("UploadPhoto", "Users", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            <table>
            <tr>
                <td>
                    <img src="@Url.Content("~/Content/images/noprofilepic.jpg")" 
                </td>
                <td>
                    <input type="file" name="photoFile" />
                    <br /><br />
                    <input type="submit" value="Upload" />
                </td>
            </tr>
            </table>                
        }
    </div>
</fieldset>

コントローラ

public class UsersController : Controller
{
    UsersRepository usersRepo = new UsersRepository();


    [Authorize]
    [HttpPost]
    public void UploadPhoto(HttpPostedFile photoFile)
    {
        if (photoFile == null)
        {
            return;
        }

        if (photoFile.ContentLength <= 0)
        {
            return;
        }

        string filename = Path.GetFileName(photoFile.FileName);
        if (Path.GetExtension(filename) == "")
            return;

    }
}

アップロードをクリックすると、ページがhttp://localhost/mvcapp/Users/UploadPhoto空白の画面に移動します。私が望むのは、編集ページに戻り、ファイルがアップロードされていないというエラーをユーザーに表示することです。ModelState.IsValidまたはのような機能ModelState.AddModelError

return View(model) など、同じビューを返すオプションもありません。

私はこれを間違った方法でやっていますか?Ajax アップローダまたはアップローダを使用することをお勧めします。フォームを分離して、アップロード部分を独自のビューにすることも考えています。この点で PartialView は役に立ちますか

4

3 に答える 3

1
[Authorize]
[HttpPost]
public void UploadPhoto(HttpPostedFile photoFile)
{

リターンのあるアクションvoidは非常に奇妙です。を返すようにActionResultして、行きたい各ブランチを決定します。

[Authorize]
[HttpPost]
public void UploadPhoto(HttpPostedFile photoFile)
{
    if (photoFile == null)
    {
        return RedirectToAction("ErrorPage");
    }
    ...

    var viewModel = ...;   // but your've lost the Edit part
    return View(viewModel);
 }
于 2012-10-01T07:58:04.823 に答える
1

以下のようにjqueryを使用して検証してみてください。これにより、ユーザーがファイルを強制的に選択するようになります...

以下のような見方をしてみましょう

<input type="file" name="Document" id="imgFile" style="height:25px;"/>
<input type="submit" value="Submit" id="btnSubmit"/>

以下は検証するjqueryです

$('#imgFile').change(function() {
    if ( ! $('#imgFile').val() ) {
    alert('Chose a file!');
    return false;
 }
});

または、以下のようにボタンクリックでこれを行うことができます

$('#btnSubmit').click(function() {
    if ( ! $('#imgFile').val() ) {
    alert('Chose a file!');
    return false;
 }
});

これがあなたを助けるかもしれないことを願っています...

于 2012-10-01T09:05:33.477 に答える
0

あなたはそのようにあなたのイメージをアップロードします

 public void UploadPhoto(HttpPostedFile photoFile)
 {}

このようにコードを少し変更する必要があると思います

 public void UploadPhoto(HttpPostedFileBase photoFile)
 {}
于 2012-10-01T09:15:45.583 に答える