Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC Controller Action Gets Called Multiple Times When Layout Is Specified

I'm having a problem where a controller action is called at least twice. I have a view that has another view as its layout page, and the view is called multiple times. If I remove the specification for the layout then the action is consistently executed once. I looked through StackOverflow and other sites but couldn't find a problem which had the same characteristics as mine so I'm posting a new question.

_ViewStart.cshtml:
@{
   Layout = "~/Views/Shared/_ProfileLayout.cshtml";
}

Index.cshtml inside my Profile folder: @{
ViewBag.Title = "Index";    
}
Index

Controller Action:
public ActionResult Index()
    {            
        //ToDo: BusinessLogic
        //This method gets called twice
        //******************//
        return View();
    }  

It seem's like a simple problem and I'm definitely missing something obvious. I've posted the sample project on this site: https://skydrive.live.com/#cid=F2DAB940147490B0&id=F2DAB940147490B0%21140

Any ideas what's wrong?

Thanks

Update: Here's the view: @{ ViewBag.Title = "TestMVCProject"; Layout = null; }

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TestMVCProject</title>
    <link rel="Stylesheet" type="text/css" href="../../Content/ActiveSite.css" />    
    <link href="../../Content/themes/TestMVCProject/jquery-ui-1.9.1.custom.min.css" rel="stylesheet" type="text/css" />
    <script src="../../Scripts/jquery-1.8.2.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery-ui-1.9.1.custom.js" type="text/javascript"></script>
</head>

<body>
<div class="container">
  <div class="header">  
  <div id="loginimagecontainer">
  @using (Html.BeginForm("LoginActions", "Account", FormMethod.Post, new { @id = "LoginActionsForm" }))
  {  
  @Html.AntiForgeryToken()      
  <a href="#"><img src="/images/icons/message-icon.png" width="60" height="60" alt="Messages" title="Messages"/></a>
  <a href="/Account/LogOff"><img src="/images/icons/log-out-icon.png" width="60" height="60" alt="Log off" title="Log off"/></a>
  }    
  </div>

  <div class="logotext"><img alt="TestMVCProject Logo" src="#" width="350" height="150" id="TestMVCProjectLogo" /></div>
    </div>    
  <div class="content profile">  
    <div id="leftPane">
        <img src="#" alt="Placeholder" width="165" height="200" id="ProfilePhoto" title="Profile Photo" />
        <div id="Username"></div>
        <div id="NavLinks">
            <div class="ProfileNavigation" onclick="Navigate('/Profile/Update')"><span>Profile</span><img src="/images/icons/edit-icon.png" width="30" height="30" alt="Profile" /></div>
            <div class="ProfileNavigation"><span>Search</span><img src="/images/icons/search-icon.png" width="30" height="30" alt="Search" /></div>
            <div class="ProfileNavigation" onclick="Navigate('/Photo')"><span>Photos</span><img src="/images/icons/camera-icon.png" width="30" height="30" alt="Photos"/></div>
        </div>
    </div>
      <div id="adcontainer">
        <h4>Ads go here</h4>
        <p>content goes here</p>    
        </div>

    <div id="centerPane">
    @RenderBody()
    </div>     

  </div>
  @RenderPage("~/Views/Shared/_Footer.cshtml")
    <div id="redirectiondialog" class="dialog">
    <br />
    Hey, wait up... we're redirecting you over to the login page
    <br />
    </div> 

    <script type="text/javascript">    
        function Navigate(url) {
            window.location = url;
            return false;
        }
    </script>
</div>
</body>
</html>

and here's the footer page:

 <div class="footer">
    <div class="fltrt">Copyright 2012 TestMVCProject Inc&nbsp;</div>
    <p><a href="/Profile/Test">About</a> | <a href="#">Contact</a> | <a href="#">FAQ</a> | <a href="#">Advertise</a> | <a href="#">Support</a> | <a href="#">Feedback</a> | <a href="#">Login</a> | <a href="#">Register</a> | <a href="#">Privacy</a> | <a href="#">Terms</a></p>    
</div>

Update: @Tieson T: Thanks, I changed this to be Html.Partial instead of RenderPage. However the problem still persists as the action method still gets called twice... (Editing description as I don't have privileges to add comments)

like image 685
user1717575 Avatar asked Dec 23 '12 18:12

user1717575


People also ask

Can one action method have multiple views?

Yes, it's possible. Just make sure your views have same view model. From a technical stand point, views don't have to have the same view model implemented within the same action. There's just as long as the controller passes in the expected type.

What is _layout Cshtml in MVC?

The file MasterLayout. cshtml represents the layout of each page in the application. Right-click on the Shared folder in the Solution Explorer, then go to Add item and click View. Copy the following layout code.

CAN controller return multiple views?

You can only return one value from a function so you can't return multiple partials from one action method. If you are trying to return two models to one view, create a view model that contains both of the models that you want to send, and make your view's model the new ViewModel.

What is the name of the default action in an MVC controller?

By default, the Index() method is a default action method for any controller, as per configured default root, as shown below. routes. MapRoute( name: "Default", url: "{controller}/{action}/{id}/{name}", defaults: new { controller = "Home", action = "Index", id = UrlParameter. Optional });


2 Answers

I figured out the problem. There was this line in the code:

<img alt="TestMVCProject Logo" src="#" width="350" height="150" id="TestMVCProjectLogo" />

The src was going back to the same page. Once I replace it with a "" it works fine now.

like image 121
user1717575 Avatar answered Sep 19 '22 11:09

user1717575


I also faced same problem. The Action was rendering twice. The only problem was with

<img id="blah" src="#" alt="your image" /> 

Dont know for what reason src attribute of image was causing to perform rendering twice on page.

I just changed it to ""`

<img id="blah" src="" alt="your image" />

and it is working fine now.

like image 40
OyeHarish Avatar answered Sep 20 '22 11:09

OyeHarish